施衛(wèi)峰
(南京電子工程研究所,江蘇 南京 210007)
MVC(Model-View-Controller)是由Smalltalk-80引入的一種面向?qū)ο蟮脑O(shè)計(jì)模式,廣泛應(yīng)用于交互式系統(tǒng)和擁有用戶圖形界面軟件系統(tǒng)的架構(gòu)設(shè)計(jì)[1-2]。MVC通過(guò)將數(shù)據(jù)表示、輸入控制和數(shù)據(jù)處理分離開來(lái),提高了軟件結(jié)構(gòu)的可擴(kuò)展性和軟件模塊的可重用性[2],在傳統(tǒng)界面程序設(shè)計(jì)(如MFC)和面向B/S系統(tǒng)的Web技術(shù)(如JSP和.NET)中得到了廣泛應(yīng)用。然而,對(duì)于模型和視圖交互頻繁的分布式系統(tǒng)來(lái)說(shuō),系統(tǒng)的模型部分往往會(huì)成為數(shù)據(jù)訪問(wèn)和計(jì)算的瓶頸。如何將模型中的計(jì)算任務(wù)合理分布到其他節(jié)點(diǎn),是MVC在分布式環(huán)境中應(yīng)用的關(guān)鍵問(wèn)題。目前,國(guó)內(nèi)已經(jīng)有了一些關(guān)于分布式MVC架構(gòu)的研究與應(yīng)用。文獻(xiàn)[3]介紹了分布式MVC在工程項(xiàng)目管理系統(tǒng)中的 Web應(yīng)用;文獻(xiàn)[4]則結(jié)合 Web Services和消息中間件技術(shù),提出了一種分布式環(huán)境下基于MVC的Web架構(gòu),并將其成功應(yīng)用于實(shí)時(shí)股票交易系統(tǒng)。雖然這些研究成果面向不同的領(lǐng)域,但不能滿足作戰(zhàn)指揮系統(tǒng)延遲的要求,其客戶端的處理也不能夠滿足作戰(zhàn)指揮系統(tǒng)的性能要求。因此,本文在傳統(tǒng)MVC模式的基礎(chǔ)上,借鑒文獻(xiàn)[3-4]中描述的一些研究成果,將模型分解為應(yīng)用模型和邏輯模型,提出了一種基于MVC的分布式作戰(zhàn)應(yīng)用框架。通過(guò)將其成功運(yùn)用于某聯(lián)合作戰(zhàn)計(jì)劃決策支持系統(tǒng)中,證明了該框架的合理性和有效性。
MVC作為一種經(jīng)典的設(shè)計(jì)模式,其目的在于通過(guò)合理的設(shè)計(jì)將應(yīng)用程序的模型部分(Model)和界面部分(View)拆開,通過(guò)彼此之間定義的接口互相通訊(Controller)[5],其原理如圖1。其中:
1)Model是應(yīng)用程序的主體部分,表示應(yīng)用程序數(shù)據(jù)和對(duì)這些數(shù)據(jù)訪問(wèn)和修改的業(yè)務(wù)邏輯,維護(hù)了業(yè)務(wù)的持久性,為Controller和View對(duì)象提供封裝的應(yīng)用業(yè)務(wù)邏輯。
2)View是應(yīng)用程序中用戶界面相關(guān)的部分,是用戶看到并與之交互的界面。通過(guò)訪問(wèn)Model對(duì)象中的數(shù)據(jù),View可視化顯示Model對(duì)象的狀態(tài)。當(dāng)Model對(duì)象中的狀態(tài)發(fā)生改變時(shí),View對(duì)象所代表的用戶界面內(nèi)容也會(huì)相應(yīng)地改變,達(dá)到內(nèi)容與形式的一致;對(duì)于同一個(gè)Model對(duì)象,針對(duì)不同的用戶請(qǐng)求,可以產(chǎn)生多個(gè)View對(duì)象。
3)Controller用于根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示,更新Model對(duì)象狀態(tài)。Controller定義了應(yīng)用程序的行為,負(fù)責(zé)View對(duì)象與Model對(duì)象之間的同步,根據(jù)用戶對(duì) View對(duì)象的操作完成對(duì)Model對(duì)象的更新,并將Model對(duì)象狀態(tài)的改變及時(shí)反映到View對(duì)象上。
MVC模式已經(jīng)在大部分JAVA開發(fā)框架中得到充分體現(xiàn),它有效地分離了用戶表現(xiàn)層 (用戶界面)和業(yè)務(wù)邏輯實(shí)現(xiàn),最大程度上實(shí)現(xiàn)了業(yè)務(wù)變更和擴(kuò)展對(duì)系統(tǒng)其它部分的影響,增加了系統(tǒng)的可擴(kuò)展性。
圖1 MVC模式原理
MVC模式將數(shù)據(jù)表示、輸入控制和數(shù)據(jù)處理分離開來(lái),給軟件設(shè)計(jì)與開發(fā)人員提供了一種良好的設(shè)計(jì)模式,提高了軟件結(jié)構(gòu)的可擴(kuò)展性和軟件模塊的可重用性,因而得到了廣泛應(yīng)用。但是,在模型和視圖交互頻繁的分布式作戰(zhàn)系統(tǒng)中,傳統(tǒng)MVC模式的部署和使用會(huì)造成數(shù)據(jù)訪問(wèn)和計(jì)算的瓶頸,遭遇到不小的挑戰(zhàn)。
一種方案是將Model、View和Controller都部署在客戶端,所有的顯示和業(yè)務(wù)邏輯都由客戶端處理,而服務(wù)器端只是作為一個(gè)原始數(shù)據(jù)存放中心(比如是一個(gè)數(shù)據(jù)庫(kù)服務(wù)器),負(fù)責(zé)簡(jiǎn)單的數(shù)據(jù)讀寫。這樣會(huì)造成客戶端的工作量非常大,與服務(wù)器端之間的數(shù)據(jù)通信比較頻繁,從而造成程序效率低下。
另一種方案是將Model和Controller部署在服務(wù)器端,客戶端只負(fù)責(zé)界面的顯示,對(duì)于用戶輸入的解析和業(yè)務(wù)邏輯的處理都在服務(wù)器端進(jìn)行。這種部署的一個(gè)典型代表就是目前取得廣泛應(yīng)用的B/S架構(gòu),在B/S架構(gòu)中,客戶端主要指網(wǎng)頁(yè)瀏覽器,負(fù)責(zé)顯示HTML頁(yè)面;用戶的輸入都將發(fā)送到服務(wù)器端進(jìn)行處理,服務(wù)器動(dòng)態(tài)生成新的HTML頁(yè)面作為結(jié)果返回給客戶端。這種方式?jīng)]有充分利用客戶機(jī)越來(lái)越強(qiáng)大的計(jì)算能力,無(wú)法在客戶端實(shí)現(xiàn)復(fù)雜的用戶交互體驗(yàn)。
如何對(duì)MVC模式進(jìn)行改進(jìn),將模型中的計(jì)算任務(wù)合理分布到其他節(jié)點(diǎn),是MVC在分布環(huán)境中應(yīng)用的關(guān)鍵問(wèn)題。我們根據(jù)模型中數(shù)據(jù)的不同特點(diǎn),將模型數(shù)據(jù)分為動(dòng)態(tài)和靜態(tài)兩部分,并據(jù)此將模型分解為上層業(yè)務(wù)模型(Application Model)和下層邏輯模型(Logic Model),如圖2所示,這與文獻(xiàn)[4]中提到的Presentation Mode和Domain Model有相通之處。歸結(jié)起來(lái)主要有以下特點(diǎn):
1)Application Model和業(yè)務(wù)流程相關(guān),將交互頻繁、計(jì)算量大的業(yè)務(wù)處理邏輯從模型中分離出來(lái),重點(diǎn)處理和顯示界面相關(guān)的數(shù)據(jù),當(dāng)接收到復(fù)雜邏輯計(jì)算的操作請(qǐng)求后,能夠?qū)⑵滢D(zhuǎn)化為L(zhǎng)ogic Model能夠理解的信息并調(diào)用相應(yīng)的方法來(lái)進(jìn)行邏輯計(jì)算,計(jì)算結(jié)果通知給相應(yīng)的View以實(shí)現(xiàn)同步;
2)Logic Model與基礎(chǔ)數(shù)據(jù)處理和邏輯計(jì)算相關(guān),作為數(shù)據(jù)服務(wù)和邏輯算法的提供者,為業(yè)務(wù)模型提供多源數(shù)據(jù)服務(wù)和底層計(jì)算模型支撐;
3)控制器直接控制Application Model,在多模型多視圖情況下,能夠有效地減少視圖與 Logic Model之間的通信和計(jì)算開銷,可以更好地支持多視圖交互式應(yīng)用。
圖2 改進(jìn)的MVC模式
可以看出,Application Model更接近面向用戶的業(yè)務(wù)流程,而Logic Mode更接近底層的邏輯計(jì)算,這兩部分的分離使得部件的重用性進(jìn)一步增加,程序的結(jié)構(gòu)更加清晰,并且有利于確定分布式程序各個(gè)功能模塊的合理分布。在該模式下,可以把 Application Model、Controller 和View部署在客戶端,Logic Model則部署在服務(wù)器端??蛻舳素?fù)責(zé)處理接近用戶界面的業(yè)務(wù)流程,可以充分利用客戶機(jī)的能力提供給用戶豐富的交互體驗(yàn);另一方面,服務(wù)器端負(fù)責(zé)連接數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)存取并處理復(fù)雜的邏輯計(jì)算。這種劃分方式使整個(gè)系統(tǒng)在客戶端有良好的響應(yīng),并且充分體現(xiàn)了MVC模式結(jié)構(gòu)清晰和重用性高的特點(diǎn),使得整個(gè)構(gòu)架易于維護(hù),是一種合理的分布式程序功能劃分方式。
綜合以上分析,我們結(jié)合作戰(zhàn)指揮應(yīng)用的特點(diǎn),提出了一種基于MVC的分布式作戰(zhàn)應(yīng)用框架,該框架基于 C/S架構(gòu),由客戶端、消息中間件[6]和服務(wù)器端三部分組成,具體如圖3所示。
圖3 基于分布式 MVC的作戰(zhàn)應(yīng)用框架
客戶端主要部署 View、Controller、Application Model三部分。其中,Application Mode負(fù)責(zé)處理客戶端的業(yè)務(wù)流程并向服務(wù)器端發(fā)送底層邏輯計(jì)算請(qǐng)求,同時(shí)處理和接收服務(wù)器端發(fā)來(lái)的計(jì)算結(jié)果。View負(fù)責(zé)顯示元素的靈活組裝和可視化展現(xiàn),Controller負(fù)責(zé)Application Mode與View之間的消息映射。消息中間件是整個(gè)框架的通信核心,客戶端之間、客戶端同服務(wù)器端之間均通過(guò)消息中間件進(jìn)行通信,同時(shí)提供同步機(jī)制實(shí)現(xiàn)服務(wù)器端到客戶端的消息同步。服務(wù)器端部署Logic Model及公共服務(wù)對(duì)象,主要用來(lái)處理復(fù)雜的邏輯計(jì)算、公共服務(wù)的操作以及和數(shù)據(jù)庫(kù)之間的通信。通過(guò)對(duì)業(yè)務(wù)功能的分離,該框架能夠使系統(tǒng)功能模塊進(jìn)行針對(duì)性分離和布置,使得各個(gè)客戶端能夠充分發(fā)揮其自身的性能,使得整個(gè)系統(tǒng)的運(yùn)行效率得到了很大的提高。
計(jì)劃決策支持是指在必要的模型、知識(shí)和數(shù)據(jù)基礎(chǔ)上,進(jìn)行分析、判斷、探索和評(píng)價(jià),直至做出決心建議的過(guò)程。目前,該技術(shù)已廣泛運(yùn)用于作戰(zhàn)指揮領(lǐng)域中,主要以作戰(zhàn)指揮學(xué)、軍事運(yùn)籌學(xué)、控制論、思維科學(xué)和行為科學(xué)為基礎(chǔ),以計(jì)算機(jī)技術(shù)、模擬技術(shù)和信息技術(shù)為手段,輔助指揮員和指揮機(jī)構(gòu)進(jìn)行作戰(zhàn)決斷。在信息化和多軍兵種聯(lián)合作戰(zhàn)條件下,聯(lián)合作戰(zhàn)計(jì)劃決策支持系統(tǒng)是提高軍隊(duì)作戰(zhàn)決策水平、實(shí)現(xiàn)決策科學(xué)化的有效途徑[7]。鑒于此應(yīng)用背景,我們開發(fā)了一套面向聯(lián)合作戰(zhàn)的計(jì)劃決策支持系統(tǒng)。
該系統(tǒng)采用上述改進(jìn)的MVC框架進(jìn)行設(shè)計(jì),系統(tǒng)架構(gòu)如圖4所示。View由系統(tǒng)主界面和各種業(yè)務(wù)界面動(dòng)態(tài)庫(kù)組成,呈現(xiàn)和用戶交互的信息。Controller主要由“統(tǒng)一控制引擎”實(shí)現(xiàn),每一個(gè)對(duì)應(yīng)的業(yè)務(wù)流程類均在該引擎中進(jìn)行注冊(cè),從而在 View和應(yīng)用流程模型間建立映射關(guān)系。Application Model由“情況判斷”、“目標(biāo)分析”、“任務(wù)區(qū)分”和“方案評(píng)估”等組成,這些模塊負(fù)責(zé)各種業(yè)務(wù)流程的組織,同時(shí)和服務(wù)器相關(guān)的邏輯計(jì)算模型進(jìn)行通信。消息傳輸總線提供底層的信息傳輸能力,同時(shí)開發(fā)了客戶端代理和服務(wù)器端代理,使之能夠滿足客戶端和服務(wù)器端之間的通信需要。服務(wù)器端由“作戰(zhàn)計(jì)算”、“能力分析”、“數(shù)據(jù)融合”和“數(shù)據(jù)管理”等組成,提供通用的邏輯算法模型及基礎(chǔ)數(shù)據(jù)信息訪問(wèn)能力。
圖4 面向聯(lián)合作戰(zhàn)的計(jì)劃決策支持系統(tǒng)架構(gòu)
面向聯(lián)合作戰(zhàn)的計(jì)劃決策支持系統(tǒng)主要基于 C++開發(fā)實(shí)現(xiàn),整個(gè)系統(tǒng)的功能實(shí)現(xiàn)比較復(fù)雜,限于篇幅,以下僅對(duì)幾個(gè)關(guān)鍵部件的實(shí)現(xiàn)進(jìn)行說(shuō)明。
1)基于插件技術(shù)的客戶端表現(xiàn)集成 關(guān)于客戶端的實(shí)現(xiàn),我們主要借鑒了Eclipse[8]的插件開發(fā)思想,通過(guò)插件開發(fā)實(shí)現(xiàn)客戶端主應(yīng)用程序與界面展示DLL分離,所有客戶端界面均以DLL模塊的形式存在,由業(yè)務(wù)流程模型根據(jù)模塊配制信息進(jìn)行動(dòng)態(tài)加載,同時(shí)主界面上的模塊菜單也是動(dòng)態(tài)生成的。其客戶端原理如圖5所示。在具體應(yīng)用開發(fā)中,對(duì)于從框架基類中繼承的各種類型窗體,將自動(dòng)被納入系統(tǒng)統(tǒng)一風(fēng)格控制器中,實(shí)現(xiàn)了當(dāng)系統(tǒng)風(fēng)格改變時(shí),各具體業(yè)務(wù)界面不需作任何的變動(dòng)(類似B/S中的CSS的效果)??蛻舳艘故净蛱幚淼臄?shù)據(jù)由統(tǒng)一控制引擎進(jìn)行分發(fā)。不僅實(shí)現(xiàn)了前臺(tái)界面的可配制,同時(shí)前臺(tái)主應(yīng)用程序?qū)τ谒蠧/S應(yīng)用都是通用的,實(shí)現(xiàn)了主程序的高可復(fù)用性。
2)基于代理技術(shù)的消息中間件 代理(Agent)是一個(gè)能在特定環(huán)境中采取復(fù)雜自治行為的計(jì)算機(jī)系統(tǒng)。從應(yīng)用的角度看,代理就是能自動(dòng)執(zhí)行用戶委托任務(wù)的計(jì)算實(shí)體[9-10]。在本系統(tǒng)中,我們基于軟件代理技術(shù)以及消息傳輸總線的通信傳輸能力,實(shí)現(xiàn)了用于客戶端之間、客戶端與服務(wù)端之間進(jìn)行信息交互的客戶/服務(wù)代理,它們和消息傳輸總線一起構(gòu)成了系統(tǒng)的消息中間件,主要實(shí)現(xiàn)如圖6所示。其中,消息傳輸總線基于TCP/IP協(xié)議實(shí)現(xiàn)數(shù)據(jù)傳輸,通過(guò)IP地址尋找目的服務(wù)器地址, 支持廣播和發(fā)布/訂閱兩種應(yīng)用模式,能夠提供基礎(chǔ)的消息傳輸、信息同步以及客戶/服務(wù)動(dòng)態(tài)發(fā)現(xiàn)能力;客戶端代理負(fù)責(zé)應(yīng)用客戶的注冊(cè),把客戶端調(diào)用轉(zhuǎn)換成服務(wù)端可識(shí)別的消息請(qǐng)求,同時(shí)接收服務(wù)端返回的計(jì)算結(jié)果并解釋為用戶可理解的形式;服務(wù)端代理負(fù)責(zé)邏輯計(jì)算模型的注冊(cè),能夠響應(yīng)客戶端的消息請(qǐng)求,根據(jù)傳遞過(guò)來(lái)的命令代號(hào)和模型類代碼查找到相應(yīng)的邏輯計(jì)算模型,將客戶請(qǐng)求交給該模型進(jìn)行處理,并把計(jì)算結(jié)果返回到客戶端。
3)基于XML的Logic Model描述規(guī)范 為了實(shí)現(xiàn)底層Logic Model的靈活擴(kuò)展,以及系統(tǒng)未來(lái)分布式、跨平臺(tái)、跨語(yǔ)言的發(fā)展需要,我們參照 Web Services中有關(guān)WSDL文件的技術(shù)標(biāo)準(zhǔn)[11],建立統(tǒng)一的Logic Mode描述規(guī)范,提供對(duì)模型屬性、模型接口、參數(shù)等元素的描述方法,為客戶/服務(wù)間 Application Model與Logic Model的互操作提供統(tǒng)一的交換標(biāo)準(zhǔn),其XML Scheme如圖7所示。
圖5 基于插件技術(shù)的客戶端原理
圖6 基于軟件代理技術(shù)的消息中間件主要實(shí)現(xiàn)
圖7 Logic Model的XML Schema
本文在傳統(tǒng) MVC 模式的基礎(chǔ)上,結(jié)合分布式作戰(zhàn)應(yīng)用的特點(diǎn),提出了一種基于MVC分布式作戰(zhàn)應(yīng)用框架,為作戰(zhàn)指揮系統(tǒng)的開發(fā)提供了一種有效的構(gòu)架解決方案。該框架通過(guò) View、Controller、Application Model和Logic Model的分離,有助于確立良好的軟件功能劃分,提高了各部件的重用性;通過(guò)界面顯示和業(yè)務(wù)邏輯的分離,使得界面程序員只關(guān)注系統(tǒng)的客戶體驗(yàn),業(yè)務(wù)程序員只關(guān)注業(yè)務(wù)邏輯,從而便于軟件的并行開發(fā),大大提高軟件開發(fā)的質(zhì)量和效率;通過(guò)業(yè)務(wù)流程模型和邏輯計(jì)算模型的合理分配,并在客戶端與客戶端之間、客戶端與服務(wù)器端之間采用自研的消息中間件進(jìn)行通信,使作戰(zhàn)指揮系統(tǒng)在運(yùn)行效能上有了顯著的提高。
[1]Gamma E, Helm R, Johnson R, et al. 設(shè)計(jì)模式[M].李英軍,等譯. 北京:電子工業(yè)出版社,2000.
[2]Buschmann F, Meunier R, Rohnert H, et al. 面向模式的軟件體系結(jié)構(gòu)(卷 1):模式系統(tǒng)[M].賁可榮,, 等譯. 北京:電子工業(yè)出版社,2005.
[3]吳宏森,宋順林. MVC架構(gòu)在工程項(xiàng)目管理系統(tǒng)中的應(yīng)用[J].微計(jì)算機(jī)信息,2006 (22):256-258.
[4]陳樂(lè),楊小虎. MVC模式在分布式環(huán)境下的應(yīng)用研究[J].計(jì)算機(jī)工程,2006(19):642-644.
[5]劉中兵. Java Web主流框架整合開發(fā)[M].北京:電子工業(yè)出版社,2008.
[6]周敏. 基于SMQ消息中間件的軍事數(shù)據(jù)交換設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)與信息技術(shù),2007 (7):3-1.
[7]張廣軍,趙占龍,權(quán)東,等. 聯(lián)合任務(wù)計(jì)劃決策支持系統(tǒng)[J].系統(tǒng)仿真學(xué)報(bào),2006 (2):279-281.
[8]張鵬,姜昊,許力. Eclipse插件開發(fā)[M].北京:電子工業(yè)出版社,2008.
[9]高保慶,傅秀芬,孟利等. 一個(gè)基于 MVC 的通用Client/Server應(yīng)用開發(fā)框架[J].計(jì)算機(jī)技術(shù)與發(fā)展,2008 .(17):126-128.
[10]Patrick AS. Building trustworthy software agents[J].Internet Computing, IEEE, 2002(6):46-53.
[11]梁愛虎. SOA思想、技術(shù)與系統(tǒng)集成應(yīng)用詳解[M].北京:電子工業(yè)出版社,2007.