??? 今天,軟件復(fù)用技術(shù)已經(jīng)深入人心,如何提高軟件模塊的復(fù)用程度成為了人們所熱心的話題。一個好的模塊,要求有很好的靈活性、移植性和擴展性。而在目前的三層應(yīng)用體系結(jié)構(gòu)下,又該怎樣來設(shè)計構(gòu)建一個復(fù)用度高的模塊才能達到降低開發(fā)成本、縮短開發(fā)周期的目的呢?我們幸運的發(fā)現(xiàn)將經(jīng)典的MVC模式運用到各層模塊的內(nèi)部劃分中,將使得模塊的設(shè)計也變得清晰簡單起來,并能很好的滿足模塊的靈活性、擴展性等要求,使得模塊的可復(fù)用程度得到了很大的提高。?
一、關(guān)于MVC設(shè)計模式?
??? MVC模式(Model-View-Controller)最初是在對應(yīng)用程序進行設(shè)計時,總結(jié)出來的一個高效的設(shè)計模式,它對程序中的各種元素進行抽象歸納,將程序的表示邏輯和業(yè)務(wù)邏輯分離,使得在設(shè)計程序結(jié)構(gòu)時,思路清晰結(jié)構(gòu)明確,也方便以后對表示層進行更改,而對于它和后臺業(yè)務(wù)邏輯的接口也劃分清晰,極大的減少了后臺業(yè)務(wù)邏輯變化對前臺界面的影響。目前流行的Struts技術(shù)就是基于MVC設(shè)計模式的Java Web前端應(yīng)用。?
二、在模塊內(nèi)部設(shè)計中引入MVC設(shè)計模式的構(gòu)想?
??? 實際上,MVC模式同時也為應(yīng)用程序模塊的內(nèi)部設(shè)計提供了一個思路,當對一個模塊進行設(shè)計時,它所面臨的問題是怎樣將內(nèi)部封閉起來,實現(xiàn)某些固定的功能,并對外提供各種可能的接口,能盡量好的與環(huán)境融合,同時能夠和其他模塊進行組裝搭配。同時還要能夠進行一些擴展,以更好的適應(yīng)應(yīng)用程序的環(huán)境。為了完成模塊的各種功能,保證正確性和靈活性,怎樣對模塊進行設(shè)計和內(nèi)部劃分就變得重要了。而MVC的劃分思路正好能很不錯的應(yīng)用于模塊的設(shè)計之中。?
圖1 將MVC模式運用于模塊內(nèi)部設(shè)計中?
??? MVC中講求用View層作為表示層面對客戶,它負責(zé)對外界客戶的交互。同樣,一個完善的模塊也需要一個專門對外的表示層,它專注于為外界各種情況提供接口(可擴展可替換的接口)。它便是模塊的View層。向內(nèi),它將可能輸入的各種參數(shù)轉(zhuǎn)化為內(nèi)部統(tǒng)一的參數(shù)形式。向外,它根據(jù)配置的環(huán)境參數(shù),將要表達的數(shù)據(jù)轉(zhuǎn)換成符合當前環(huán)境特征的數(shù)據(jù)格式向外表示。外界只能通過它跟模塊打交道,它負責(zé)了模塊內(nèi)外的聯(lián)系,并進行模塊內(nèi)外數(shù)據(jù)格式轉(zhuǎn)換。View層的獨立設(shè)計使得接口可以即時進行更換和定制,讓模塊能靈活用于各種不同系統(tǒng)的環(huán)境下,這樣就能有效的提高模塊重用度。?
??? 而普通MVC中的Model層,要求封裝系統(tǒng)的狀態(tài),使用一組數(shù)據(jù)來表示系統(tǒng)的一個狀態(tài)。同樣在模塊中,需要將模塊內(nèi)核的數(shù)據(jù)封裝起來作為模塊的一個狀態(tài)??刂茖拥拿恳淮尾僮鞫荚谧x取原狀態(tài),進行數(shù)據(jù)處理,最后再寫入新狀態(tài),整個過程就是將原狀態(tài)改變到另一個狀態(tài)。這樣減輕了模塊內(nèi)部的復(fù)雜度,方便模塊內(nèi)部的分工。甚至可以說Model就是模塊內(nèi)部的數(shù)據(jù)池。?
??? MVC中的Control層也即控制層,負責(zé)響應(yīng)View層傳送過來的請求,它將Model中的數(shù)據(jù)進行運算,再將結(jié)果寫回到Model中。同樣在模塊中,可將實現(xiàn)模塊功能的部分作為Control層。因為只有它和核心運算部件打交道,從而來改變模塊的狀態(tài)。它也始終只用模塊內(nèi)部統(tǒng)一的數(shù)據(jù)格式來與核心部件通訊,而這種數(shù)據(jù)格式正是在View層根據(jù)外界輸入的參數(shù)生成或轉(zhuǎn)換過來的。?
??? 通過在模塊內(nèi)部設(shè)計中模仿MVC模式,可以使模塊的設(shè)計清晰化,對模塊的各部分可以進行有重點的設(shè)計,有利于提高模塊的質(zhì)量和靈活性。由此而產(chǎn)生的應(yīng)用程序更有強大的生命力。?
三、MVC模式在多層模塊設(shè)計中的運用?
??? 對于大型系統(tǒng)程序,分層設(shè)計思想是很適合的當前開發(fā)的。將應(yīng)用程序分為幾個層次(客戶層,應(yīng)用層,數(shù)據(jù)層),可使各層著重于各自的重點。而各層模塊也可以在分層思想的框架下來進行設(shè)計。比較簡單的作法就是,從上至下,在每一層都將各自及以下各層組合為一個模塊。下面簡要介紹在各層組織模塊的一些想法。?
圖2 MVC模式在多層模塊設(shè)計中的運用?
?
??? 在客戶層,我們可以將客戶層和下面的各層合在一起看作一個模塊。下層的模塊可視為本層模塊中的子模塊。若在該層采用Struts技術(shù)將使得整個結(jié)構(gòu)非常清晰。在該層的模塊化可以這樣進行:模塊的View層采用JSP和Java Servlet來定制,運用JSTL和Struts標簽庫技術(shù),使得表達更加靈活。甚至可以使用自定義標簽來擴展JSP功能,比如可以生成餅狀圖等各種統(tǒng)計圖形。對于客戶層模塊中的Model,Struts框架提供了很好的ActionForm。它可以使用自己定制的JavaBean,也可以由Struts框架根據(jù)配置動態(tài)生成的ActionForm。View層將一切收集到的數(shù)據(jù)都放入ActionForm中,然后通知控制層來處理數(shù)據(jù)。Struts框架在Control層使用ActionServlet來對數(shù)據(jù)處理進行控制的。當然在客戶層的數(shù)據(jù)處理更多的是對數(shù)據(jù)格式的轉(zhuǎn)化,對數(shù)據(jù)的整理封裝,然后通知它的核心運算部件(即應(yīng)用層的模塊)來進行運算處理。?
??? 在應(yīng)用層,同樣將應(yīng)用層和下面的數(shù)據(jù)層組合在一起成為一個模塊。在這一模塊中它的View層由Action充當,它負責(zé)對外進行數(shù)據(jù)的表達和傳遞。而模塊中對數(shù)據(jù)進行保存和傳遞的Model可以由值對象VO來充當,它負責(zé)封裝view層的數(shù)據(jù)然后交由控制層處理。而控制層中實現(xiàn)業(yè)務(wù)邏輯的控制類也是將數(shù)據(jù)寫入值對象VO后,交由view層來向外界表達的。?
??? 在數(shù)據(jù)層,它的模塊獨立性更強。在該層的view層,將數(shù)據(jù)轉(zhuǎn)化為直接跟存儲有關(guān)系的數(shù)據(jù),交由控制層來處理。這一個功能可由各自的DAO來完成,它們各自將數(shù)據(jù)轉(zhuǎn)換為統(tǒng)一的ObjectDAO能操作的數(shù)據(jù)格式(比如封裝了SQL語句以及其他指令和結(jié)果的一個數(shù)據(jù)包),然后統(tǒng)一調(diào)用一個實際與數(shù)據(jù)庫進行交互的代理ObjectDAO。而這個代理就充當了模塊的Control層。它負責(zé)最終調(diào)用數(shù)據(jù)庫操作來改變數(shù)據(jù),改變模塊的狀態(tài)。?
四、結(jié)束語?
??? 作為一個擁高復(fù)用程度的模塊,它的要求是能盡量廣泛的用在各種環(huán)境下,能以最小的代價自適應(yīng)環(huán)境,保證模塊能正確的完成外界交給的任務(wù)。用于應(yīng)用程序?qū)哟卧O(shè)計的MVC思想正好為模塊內(nèi)部的設(shè)計提供了一個很不錯的想法,即控制和數(shù)據(jù)分開的思想,將模塊內(nèi)部中邏輯處理和數(shù)據(jù)封裝分開來設(shè)計。這樣簡化了內(nèi)部設(shè)計的難度,也提高了模塊的靈活性進而提高了模塊的復(fù)用度。MVC的思想往往能為復(fù)雜的任務(wù)提供清晰的設(shè)計方案。所以我們應(yīng)該在程序設(shè)計中多借鑒它的思想,往往能設(shè)計出清晰簡單的方案。?
參考文獻:?
1.?????? Chuck Cavaness? 《Programming Jakarta Struts》 O'Reilly 2002.11 ?
2.?????? CT Arrington 著 《Enterprise Java with UML 》中文版? 機械工業(yè)出版社 2003.7?
3.?????? Ivar Jacobson,Martin Griss,Patrik Jonsson 《Software Reuse Architecture,Process and Organization for Business Success》 機械工業(yè)出版社 2003.1?
4.?????? James Turner, Kevin Bedell 《Struts Kick Start》 Sams Publishing 2002.11?
5.?????? William Crawford, Jonathan Kaplan? 《J2EE Design Patterns》? O'Reilly 2003.9?
6.?????? J2EE Specification,http://java.sun.com ?
7.?????? XML Specification,http://www.w3.org?