施卫峰
(南京电子工程研究所,江苏 南京 210007)
MVC(Model-View-Controller)是由Smalltalk-80引入的一种面向对象的设计模式,广泛应用于交互式系统和拥有用户图形界面软件系统的架构设计[1-2]。MVC通过将数据表示、输入控制和数据处理分离开来,提高了软件结构的可扩展性和软件模块的可重用性[2],在传统界面程序设计(如MFC)和面向B/S系统的Web技术(如JSP和.NET)中得到了广泛应用。然而,对于模型和视图交互频繁的分布式系统来说,系统的模型部分往往会成为数据访问和计算的瓶颈。如何将模型中的计算任务合理分布到其他节点,是MVC在分布式环境中应用的关键问题。目前,国内已经有了一些关于分布式MVC架构的研究与应用。文献[3]介绍了分布式MVC在工程项目管理系统中的 Web应用;文献[4]则结合 Web Services和消息中间件技术,提出了一种分布式环境下基于MVC的Web架构,并将其成功应用于实时股票交易系统。虽然这些研究成果面向不同的领域,但不能满足作战指挥系统延迟的要求,其客户端的处理也不能够满足作战指挥系统的性能要求。因此,本文在传统MVC模式的基础上,借鉴文献[3-4]中描述的一些研究成果,将模型分解为应用模型和逻辑模型,提出了一种基于MVC的分布式作战应用框架。通过将其成功运用于某联合作战计划决策支持系统中,证明了该框架的合理性和有效性。
MVC作为一种经典的设计模式,其目的在于通过合理的设计将应用程序的模型部分(Model)和界面部分(View)拆开,通过彼此之间定义的接口互相通讯(Controller)[5],其原理如图1。其中:
1)Model是应用程序的主体部分,表示应用程序数据和对这些数据访问和修改的业务逻辑,维护了业务的持久性,为Controller和View对象提供封装的应用业务逻辑。
2)View是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。通过访问Model对象中的数据,View可视化显示Model对象的状态。当Model对象中的状态发生改变时,View对象所代表的用户界面内容也会相应地改变,达到内容与形式的一致;对于同一个Model对象,针对不同的用户请求,可以产生多个View对象。
3)Controller用于根据用户的输入,控制用户界面数据显示,更新Model对象状态。Controller定义了应用程序的行为,负责View对象与Model对象之间的同步,根据用户对 View对象的操作完成对Model对象的更新,并将Model对象状态的改变及时反映到View对象上。
MVC模式已经在大部分JAVA开发框架中得到充分体现,它有效地分离了用户表现层 (用户界面)和业务逻辑实现,最大程度上实现了业务变更和扩展对系统其它部分的影响,增加了系统的可扩展性。
图1 MVC模式原理
MVC模式将数据表示、输入控制和数据处理分离开来,给软件设计与开发人员提供了一种良好的设计模式,提高了软件结构的可扩展性和软件模块的可重用性,因而得到了广泛应用。但是,在模型和视图交互频繁的分布式作战系统中,传统MVC模式的部署和使用会造成数据访问和计算的瓶颈,遭遇到不小的挑战。
一种方案是将Model、View和Controller都部署在客户端,所有的显示和业务逻辑都由客户端处理,而服务器端只是作为一个原始数据存放中心(比如是一个数据库服务器),负责简单的数据读写。这样会造成客户端的工作量非常大,与服务器端之间的数据通信比较频繁,从而造成程序效率低下。
另一种方案是将Model和Controller部署在服务器端,客户端只负责界面的显示,对于用户输入的解析和业务逻辑的处理都在服务器端进行。这种部署的一个典型代表就是目前取得广泛应用的B/S架构,在B/S架构中,客户端主要指网页浏览器,负责显示HTML页面;用户的输入都将发送到服务器端进行处理,服务器动态生成新的HTML页面作为结果返回给客户端。这种方式没有充分利用客户机越来越强大的计算能力,无法在客户端实现复杂的用户交互体验。
如何对MVC模式进行改进,将模型中的计算任务合理分布到其他节点,是MVC在分布环境中应用的关键问题。我们根据模型中数据的不同特点,将模型数据分为动态和静态两部分,并据此将模型分解为上层业务模型(Application Model)和下层逻辑模型(Logic Model),如图2所示,这与文献[4]中提到的Presentation Mode和Domain Model有相通之处。归结起来主要有以下特点:
1)Application Model和业务流程相关,将交互频繁、计算量大的业务处理逻辑从模型中分离出来,重点处理和显示界面相关的数据,当接收到复杂逻辑计算的操作请求后,能够将其转化为Logic Model能够理解的信息并调用相应的方法来进行逻辑计算,计算结果通知给相应的View以实现同步;
2)Logic Model与基础数据处理和逻辑计算相关,作为数据服务和逻辑算法的提供者,为业务模型提供多源数据服务和底层计算模型支撑;
3)控制器直接控制Application Model,在多模型多视图情况下,能够有效地减少视图与 Logic Model之间的通信和计算开销,可以更好地支持多视图交互式应用。
图2 改进的MVC模式
可以看出,Application Model更接近面向用户的业务流程,而Logic Mode更接近底层的逻辑计算,这两部分的分离使得部件的重用性进一步增加,程序的结构更加清晰,并且有利于确定分布式程序各个功能模块的合理分布。在该模式下,可以把 Application Model、Controller 和View部署在客户端,Logic Model则部署在服务器端。客户端负责处理接近用户界面的业务流程,可以充分利用客户机的能力提供给用户丰富的交互体验;另一方面,服务器端负责连接数据库进行数据存取并处理复杂的逻辑计算。这种划分方式使整个系统在客户端有良好的响应,并且充分体现了MVC模式结构清晰和重用性高的特点,使得整个构架易于维护,是一种合理的分布式程序功能划分方式。
综合以上分析,我们结合作战指挥应用的特点,提出了一种基于MVC的分布式作战应用框架,该框架基于 C/S架构,由客户端、消息中间件[6]和服务器端三部分组成,具体如图3所示。
图3 基于分布式 MVC的作战应用框架
客户端主要部署 View、Controller、Application Model三部分。其中,Application Mode负责处理客户端的业务流程并向服务器端发送底层逻辑计算请求,同时处理和接收服务器端发来的计算结果。View负责显示元素的灵活组装和可视化展现,Controller负责Application Mode与View之间的消息映射。消息中间件是整个框架的通信核心,客户端之间、客户端同服务器端之间均通过消息中间件进行通信,同时提供同步机制实现服务器端到客户端的消息同步。服务器端部署Logic Model及公共服务对象,主要用来处理复杂的逻辑计算、公共服务的操作以及和数据库之间的通信。通过对业务功能的分离,该框架能够使系统功能模块进行针对性分离和布置,使得各个客户端能够充分发挥其自身的性能,使得整个系统的运行效率得到了很大的提高。
计划决策支持是指在必要的模型、知识和数据基础上,进行分析、判断、探索和评价,直至做出决心建议的过程。目前,该技术已广泛运用于作战指挥领域中,主要以作战指挥学、军事运筹学、控制论、思维科学和行为科学为基础,以计算机技术、模拟技术和信息技术为手段,辅助指挥员和指挥机构进行作战决断。在信息化和多军兵种联合作战条件下,联合作战计划决策支持系统是提高军队作战决策水平、实现决策科学化的有效途径[7]。鉴于此应用背景,我们开发了一套面向联合作战的计划决策支持系统。
该系统采用上述改进的MVC框架进行设计,系统架构如图4所示。View由系统主界面和各种业务界面动态库组成,呈现和用户交互的信息。Controller主要由“统一控制引擎”实现,每一个对应的业务流程类均在该引擎中进行注册,从而在 View和应用流程模型间建立映射关系。Application Model由“情况判断”、“目标分析”、“任务区分”和“方案评估”等组成,这些模块负责各种业务流程的组织,同时和服务器相关的逻辑计算模型进行通信。消息传输总线提供底层的信息传输能力,同时开发了客户端代理和服务器端代理,使之能够满足客户端和服务器端之间的通信需要。服务器端由“作战计算”、“能力分析”、“数据融合”和“数据管理”等组成,提供通用的逻辑算法模型及基础数据信息访问能力。
图4 面向联合作战的计划决策支持系统架构
面向联合作战的计划决策支持系统主要基于 C++开发实现,整个系统的功能实现比较复杂,限于篇幅,以下仅对几个关键部件的实现进行说明。
1)基于插件技术的客户端表现集成 关于客户端的实现,我们主要借鉴了Eclipse[8]的插件开发思想,通过插件开发实现客户端主应用程序与界面展示DLL分离,所有客户端界面均以DLL模块的形式存在,由业务流程模型根据模块配制信息进行动态加载,同时主界面上的模块菜单也是动态生成的。其客户端原理如图5所示。在具体应用开发中,对于从框架基类中继承的各种类型窗体,将自动被纳入系统统一风格控制器中,实现了当系统风格改变时,各具体业务界面不需作任何的变动(类似B/S中的CSS的效果)。客户端要展示或处理的数据由统一控制引擎进行分发。不仅实现了前台界面的可配制,同时前台主应用程序对于所有C/S应用都是通用的,实现了主程序的高可复用性。
2)基于代理技术的消息中间件 代理(Agent)是一个能在特定环境中采取复杂自治行为的计算机系统。从应用的角度看,代理就是能自动执行用户委托任务的计算实体[9-10]。在本系统中,我们基于软件代理技术以及消息传输总线的通信传输能力,实现了用于客户端之间、客户端与服务端之间进行信息交互的客户/服务代理,它们和消息传输总线一起构成了系统的消息中间件,主要实现如图6所示。其中,消息传输总线基于TCP/IP协议实现数据传输,通过IP地址寻找目的服务器地址, 支持广播和发布/订阅两种应用模式,能够提供基础的消息传输、信息同步以及客户/服务动态发现能力;客户端代理负责应用客户的注册,把客户端调用转换成服务端可识别的消息请求,同时接收服务端返回的计算结果并解释为用户可理解的形式;服务端代理负责逻辑计算模型的注册,能够响应客户端的消息请求,根据传递过来的命令代号和模型类代码查找到相应的逻辑计算模型,将客户请求交给该模型进行处理,并把计算结果返回到客户端。
3)基于XML的Logic Model描述规范 为了实现底层Logic Model的灵活扩展,以及系统未来分布式、跨平台、跨语言的发展需要,我们参照 Web Services中有关WSDL文件的技术标准[11],建立统一的Logic Mode描述规范,提供对模型属性、模型接口、参数等元素的描述方法,为客户/服务间 Application Model与Logic Model的互操作提供统一的交换标准,其XML Scheme如图7所示。
图5 基于插件技术的客户端原理
图6 基于软件代理技术的消息中间件主要实现
图7 Logic Model的XML Schema
本文在传统 MVC 模式的基础上,结合分布式作战应用的特点,提出了一种基于MVC分布式作战应用框架,为作战指挥系统的开发提供了一种有效的构架解决方案。该框架通过 View、Controller、Application Model和Logic Model的分离,有助于确立良好的软件功能划分,提高了各部件的重用性;通过界面显示和业务逻辑的分离,使得界面程序员只关注系统的客户体验,业务程序员只关注业务逻辑,从而便于软件的并行开发,大大提高软件开发的质量和效率;通过业务流程模型和逻辑计算模型的合理分配,并在客户端与客户端之间、客户端与服务器端之间采用自研的消息中间件进行通信,使作战指挥系统在运行效能上有了显著的提高。
[1]Gamma E, Helm R, Johnson R, et al. 设计模式[M].李英军,等译. 北京:电子工业出版社,2000.
[2]Buschmann F, Meunier R, Rohnert H, et al. 面向模式的软件体系结构(卷 1):模式系统[M].贲可荣,, 等译. 北京:电子工业出版社,2005.
[3]吴宏森,宋顺林. MVC架构在工程项目管理系统中的应用[J].微计算机信息,2006 (22):256-258.
[4]陈乐,杨小虎. MVC模式在分布式环境下的应用研究[J].计算机工程,2006(19):642-644.
[5]刘中兵. Java Web主流框架整合开发[M].北京:电子工业出版社,2008.
[6]周敏. 基于SMQ消息中间件的军事数据交换设计与实现[J].计算机与信息技术,2007 (7):3-1.
[7]张广军,赵占龙,权东,等. 联合任务计划决策支持系统[J].系统仿真学报,2006 (2):279-281.
[8]张鹏,姜昊,许力. Eclipse插件开发[M].北京:电子工业出版社,2008.
[9]高保庆,傅秀芬,孟利等. 一个基于 MVC 的通用Client/Server应用开发框架[J].计算机技术与发展,2008 .(17):126-128.
[10]Patrick AS. Building trustworthy software agents[J].Internet Computing, IEEE, 2002(6):46-53.
[11]梁爱虎. SOA思想、技术与系统集成应用详解[M].北京:电子工业出版社,2007.