孔凡興
[摘要]針對傳統MVC設計模式的缺點,結合結構型模式中Facade,Bridge和Dynamic Proxy模式設計理念,提出一種分布式系統的優化Mvc模型,并將該模型應用到J2EE在線考試管理系中。實踐表明,優化的MVC型在應用中具有良好的可重用性和擴展性。
[關鍵詞]結構型模式Facade Bridge MVC
中圖分類號:TP3立獻標識碼:A文章編號:1671--7597(2009)1020076--01
設計模式是一套被反復使用、經過驗證的設計經驗的總結,是在某一情景下類似問題的重復性解決方案。使用設計模式可改善代碼的可維護性和可重用性,讓開發者從一個更高的視角進行設計思考。然而,面對新的更加復雜的應用需求,迫切需要尋找和設計更有效的設計模式來指導應用程序開發過程。
Model-Yiew-Control(MVC)模式是目前國內外較流行、高效的設計模式之一。然而傳統的MVC模式還存在一些不盡人意的地方,控制器與模型之間保持清晰的界限,不同層次之間的頻繁的通信會消耗大量的系統資源;每個控制器直接與業務邏輯相關聯,當業務邏輯改變時,需改變與該業務相應的控制器;對不同類型數據的低效率訪問,模型操作的接口不同,需要多次調用才能獲得需要的數據。為克服MVC模式以上的缺點,結合Fa-cade,Bridge和Dynamic Proxy幾種典型模式各自的特點來改進傳統MVC模式的不足,從而解決傳統MVC模式中信息通信資源消耗大、控制器與業務邏輯高耦合等缺點,提高了系統的靈活性和開發效率。
一、優化的MVC設計模式
(一)引入Facade模式思想
問題描述:由于MVC在不同程序邏輯之間要保持清晰的界限,因此在不同層次之間的通信會有性能上的損失,控制器與模型之間的回路信息會消耗大量的系統資源。
Facade模式的思想是提供一個統一的高層次接口,使得子系統更容易調用。在Mvc模式中引入Facade模型,將復雜的業務邏輯分成多個子系統,Facade模式采用Session Bean(會話Bean)作為較高邏輯提供統一的接口,將系統的業務邏輯集中,從而降低客戶端與服務器之間的耦合度,降低系統的復雜性。在分布式環境中Facade模型的引入為遠程對象提供了粗粒度的訪問,減少客戶端與服務器之間頻繁的調用,提高了系統性能。
(二)引入Bridge模式思想
問題描述:MVC中每個控制器直接與業務邏輯相關聯,當業務邏輯改變時,需改變與該業務相關的控制器。Bridge的主要思想是將抽象與實現分離,使它們可以獨立地變化,當僅使用Session Facade模式時,客戶端與EJB(Enterprise Java Bean)層緊密的耦合,形成控制器和業務邏輯的強依賴關系。Bridge模式在抽象類和它的實現類之間提供一個分層,控制一個對象到另一個對象的訪問,因此,采用Bridge來創建中間構件可以分離客戶端和Sesslon Bean之間耦合關系。在實際應用,將同組業務邏輯設計成為抽象類,由具體的業務類邏輯來實現,應用Java反向映射機制,控制器使用XML分析器來根據不同的模塊配置進行Bridge抽象類實例化,再調用其方法,而不需要知道它請求的具體行為。Bridge在抽象類與實現之間,起到了橋梁作用,使控制器和業務邏輯可以獨立變化。
(三)引入Dynamio Proxy模式思想
問題描述:HVC中模型對不同類型數據訪問效得需要的數據。DynamicProxy模式通過在運行期構建一個對接口的動態實現類來對目標對象的代理,它在對間提供一個接口層,控制一個對象到另一個對象訪問。利用Dynamic Proxy模式定義訪問不同數源的接口,針對數據源不同類型在實現的類中定不同數據源的訪問方法,獲取和操作數據,能同時持多個數據庫。這樣當數據庫類型更換時,不會及到商業邏輯代碼的大量修改。J2髓應用中,Session Bean一般和客戶端應用是一一對應,而和據庫聯系緊密的是Entity Bean(實體Bean),Proxy式實質是在Entity Bean和數據源之間又多了一ProxyDAO的數據訪問對象。Dynamic Proxy的引入系統的模型業務與數據存取分離,模型業務類只責數據的操作,不涉及具體的數據源,當數據發生化時,不影響系統的業務處理。
二、典型的網絡應用
(一)應用實例
以J2EE架構在線考試試卷管理系統為例來明采用優化MVC的分布式應用模型的優點。圖的UML的序列圖表示該系統進行試卷管理的業流程,實現標準化試卷資源的數據庫管理,試卷資的共享和快速分發,為學生用戶提供在線測試功能。
(二)具體的實現方法
1以試卷管理為例,將考試系統中的添加試卷、查試卷等業務子系統提供一個基于工作流的接口,入Facade模式。通過PaperFacade會話Bean進行業務邏輯封裝,簡化了原系統設計,實現示例如下。publicclass PaperFacade implements SessionBean。以本例中試卷申請業務為例,采用傳統MVC模式Controller必須與數據實體對象直接遠程交互,進行一次試卷申請至少需要2次遠程調用,而加入Facade層后在一個事務中就可以完成,而且將訪問的多個數據屬性封裝到一個對象中傳遞減少網絡傳輸資源消耗。可見,通過Facade會話層實現對事務的管理,避免了分布式對象之間遠程調用的資源消耗。減輕控制器的負擔,從而降低控制器和模式耦合。
2加入Bridge模式的Web應用。針對控制器與業務方法之間過于緊密問題,解決方法是將抽象類和它的實現部分放在不同的層次結構。以試卷管理為例,將試卷管理分離成抽象類AbsAdmin和它的實現類^dminPaperImpl,業務操作類(增加、刪除試卷)擴展AdminPaperlmpl,并實現具體的業務操作action方法。在AbsAdmin類中創建私有的AdminPaperImpl成員變量,在action方法調用adminimpl的業務方法。這樣就可以在控制器動態決定具體執行哪個業務方法,由具體的業務類進行實例化RefinedAbstration類。