摘要:在軟件的開發(fā)過程中,通常側(cè)重于系統(tǒng)的開發(fā)與實(shí)現(xiàn),而忽略了體系結(jié)構(gòu)的質(zhì)量和組件的可復(fù)用性。設(shè)計(jì)模式使開發(fā)人員可以更簡單方便地復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu),將設(shè)計(jì)模式與小城鎮(zhèn)電子政務(wù)相結(jié)合構(gòu)建一個(gè)基于設(shè)計(jì)模式的電子政務(wù)系統(tǒng)。研究結(jié)果對于設(shè)計(jì)模式的應(yīng)用和解決設(shè)計(jì)電子政務(wù)所遇到的問題都有很強(qiáng)的現(xiàn)實(shí)意義。
關(guān)鍵詞:J2EE;設(shè)計(jì)模式;電子政務(wù)
中圖法分類號:TP31152文獻(xiàn)標(biāo)識碼:A
文章編號:1001-3695(2006)09-0169-03
隨著小城鎮(zhèn)經(jīng)濟(jì)結(jié)構(gòu)、產(chǎn)業(yè)結(jié)構(gòu)的不斷變化,小城鎮(zhèn)的功能也由單一走向綜合。作為承擔(dān)公共事務(wù)管理的政府部門,信息量、業(yè)務(wù)量急劇增加,對于政府部門的組織與協(xié)調(diào)工作提出了更高的要求[1]。因此建立鎮(zhèn)政務(wù)、村政務(wù)信息化網(wǎng)絡(luò),實(shí)現(xiàn)行政機(jī)關(guān)的辦公現(xiàn)代化成為小城鎮(zhèn)信息化的關(guān)鍵組成。為使系統(tǒng)滿足政務(wù)管理工作不斷深化與發(fā)展的需要,小城鎮(zhèn)電子政務(wù)系統(tǒng)應(yīng)該是一個(gè)綜合性的政務(wù)管理信息系統(tǒng),同時(shí)具有強(qiáng)大的擴(kuò)展能力,可以與已有系統(tǒng)和新開發(fā)的系統(tǒng)掛接,并能與這些系統(tǒng)很好地融合,實(shí)現(xiàn)數(shù)據(jù)共享。
設(shè)計(jì)模式(DesignPatterns)被用來在特定場景下解決一般設(shè)計(jì)問題的類和相互通信的對象的描述,體系良好的項(xiàng)目都大量應(yīng)用設(shè)計(jì)模式。設(shè)計(jì)模式代表的是成千上萬的開發(fā)者集體的知識和經(jīng)驗(yàn),是從成功的系統(tǒng)設(shè)計(jì)中分離出來的可復(fù)用的優(yōu)秀設(shè)計(jì)經(jīng)驗(yàn),正確地應(yīng)用設(shè)計(jì)模式可以提高系統(tǒng)體系結(jié)構(gòu)的質(zhì)量,并使系統(tǒng)的代碼更加簡潔和可復(fù)用[3]。
基于小城鎮(zhèn)的這些特點(diǎn),要實(shí)現(xiàn)高度實(shí)用性和易用性,系統(tǒng)必須充分地運(yùn)用成熟的開發(fā)技術(shù)。因此我們運(yùn)用了大量的設(shè)計(jì)模式,設(shè)計(jì)實(shí)現(xiàn)J2EE平臺(tái)上Web方式的辦公信息系統(tǒng)。
1系統(tǒng)框架的構(gòu)建介紹
本系統(tǒng)是基于J2EE的三層模式的架構(gòu)(圖1),它的最大優(yōu)點(diǎn)是將業(yè)務(wù)邏輯放到系統(tǒng)服務(wù)和用戶接口之間,從而使業(yè)務(wù)邏輯與表現(xiàn)層分開。
表現(xiàn)層包括系統(tǒng)人機(jī)對話接口、系統(tǒng)各項(xiàng)應(yīng)用功能的整合等。業(yè)務(wù)層實(shí)現(xiàn)具體的業(yè)務(wù)功能,滿足用戶的最終需求,并提供可供各個(gè)應(yīng)用層復(fù)用的、支持各類特定功能或關(guān)鍵技術(shù)的模塊、組件、控制或網(wǎng)絡(luò)服務(wù)(WebService)。數(shù)據(jù)層包括系統(tǒng)內(nèi)各種關(guān)系數(shù)據(jù)庫、文件數(shù)據(jù)庫、基于對等網(wǎng)絡(luò)的分布式數(shù)據(jù)庫、多媒體數(shù)據(jù)庫的管理以及政府資料的存儲(chǔ)管理、訪問保密、同步更新、安全傳輸?shù)取?/p>
2基于設(shè)計(jì)模式實(shí)現(xiàn)
為了使得J2EE平臺(tái)上電子政務(wù)系統(tǒng)既具有國際標(biāo)準(zhǔn)技術(shù)規(guī)范,又更具靈活性、實(shí)用性,我們根據(jù)在系統(tǒng)不同層次結(jié)構(gòu)所遇到的問題采用不同的模式。系統(tǒng)主要采用以下幾種設(shè)計(jì)模式來完成整個(gè)系統(tǒng)的設(shè)計(jì):①在表現(xiàn)層利用截取過濾(InterceptingFilter)模式來承擔(dān)客戶端預(yù)處理和后處理的任務(wù),實(shí)現(xiàn)對系統(tǒng)的安全訪問;②在業(yè)務(wù)層利用會(huì)話外觀(SessionFacade)模式封裝業(yè)務(wù)邏輯,以減少客戶端與服務(wù)器端的相互依賴,用工廠(Factory)模式實(shí)現(xiàn)資源接口的統(tǒng)一,用裝飾(Decorate)模式動(dòng)態(tài)、透明的方式給單個(gè)對象添加職責(zé);③在數(shù)據(jù)層利用數(shù)據(jù)訪問對象(DAO)模式、Factory模式和值對象(VO)模式的組合結(jié)構(gòu)實(shí)現(xiàn)對數(shù)據(jù)庫的透明訪問。
2.1截取過濾模式
截取過濾模式承擔(dān)表現(xiàn)層的預(yù)處理和后處理任務(wù),通過一系列的過濾器實(shí)現(xiàn)安全、登錄、系統(tǒng)調(diào)試,并且這些過濾模塊是與核心模塊分開的,可以隨著系統(tǒng)職能或規(guī)則的變化任意添加或刪除[2]。截取過濾模式時(shí)序圖如圖2所示。
電子政務(wù)系統(tǒng)中,為了保障系統(tǒng)安全,設(shè)計(jì)了不同角色。超級用戶可以為所有的用戶分配權(quán)限,而不同的用戶,由于職務(wù)、部門的不同,使用的功能模塊也不同,所以必須對用戶使用系統(tǒng)進(jìn)行控制。使用截取過濾模式無疑是在客戶端和資源之間建立起一道安全的防火墻。本系統(tǒng)中,用戶的Web訪問和系統(tǒng)響應(yīng)都需要一定的預(yù)處理和后處理,針對不同的用戶,檢驗(yàn)用戶輸入、截獲請求和對其采用一組過濾,如用戶身份、用戶請求的合法性等,這些都要進(jìn)行預(yù)處理;而另外一些請求,如用戶的用戶環(huán)境信息等則會(huì)在過濾器中進(jìn)行補(bǔ)充之后才能傳送給后端模塊。
在業(yè)務(wù)邏輯中各種操作權(quán)限是與用戶級別有關(guān)系的,作為接口的實(shí)現(xiàn)——過濾器正是將這種對應(yīng)關(guān)系聯(lián)系起來。同時(shí)還可以配置過濾器,然后將日志類加入到過濾器中,使得用戶訪問JSP或者Servlet時(shí)把訪問的文件、時(shí)間、用戶寫到日志中,通過Log4j生成用戶訪問日志。
2.2會(huì)話外觀模式
業(yè)務(wù)層大量使用了各種服務(wù)與控件,并生成具有確定功能的系統(tǒng)“插件”。但是如果在設(shè)計(jì)中直接封裝業(yè)務(wù)邏輯會(huì)帶來如下問題:①客戶端的對象需要很清楚地知道與Bean之間的交互動(dòng)作,但卻無法判斷客戶端使用Bean是否正確。②如果Bean的API被修改了,那么客戶端的對象也要作出相應(yīng)的修改,而這種改動(dòng)很難控制。同時(shí)由于工作流中的幾個(gè)EnterpriseBean在同一臺(tái)Server上,當(dāng)一個(gè)客戶端的對象進(jìn)行遠(yuǎn)程調(diào)用時(shí)都會(huì)同時(shí)調(diào)用,無形之中增加了網(wǎng)絡(luò)負(fù)擔(dān)。針對這一問題,使用了SessionFacade(會(huì)話外觀)設(shè)計(jì)模式,如圖3所示。SessionFacade模式提供了一個(gè)封裝業(yè)務(wù)和實(shí)現(xiàn)工作流邏輯的清晰層,它為一組EnterpriseBean提供了一個(gè)統(tǒng)一的接口。它執(zhí)行起來很像是一個(gè)SessionBean,采用這些Bean可為一系列的業(yè)務(wù)邏輯提供統(tǒng)一的接口來實(shí)現(xiàn)流程,而且所有關(guān)于業(yè)務(wù)邏輯實(shí)現(xiàn)流程所需要的改變都與客戶端無關(guān)。
在系統(tǒng)中,使用這一模式實(shí)現(xiàn)上級向下級分配工作任務(wù)。使用SessionBean:MakeTask來提供客戶端所需要的服務(wù),并用與兩個(gè)實(shí)體Bean:User(用戶)和Task(任務(wù))相互聯(lián)系,被硬編碼后通過本地接口與兩個(gè)實(shí)體Bean通信。客戶端不直接訪問這兩個(gè)Bean,而是通過一個(gè)在MakeTask中的簡單接口來訪問,因此,只需要一次遠(yuǎn)程的調(diào)用就可以進(jìn)行任務(wù)分配了。并且當(dāng)客戶端申請調(diào)用的請求被發(fā)送到MakeTask時(shí),它會(huì)調(diào)整“相鄰的”的在同一臺(tái)服務(wù)器上的EnterpriseBeans,僅通過一次網(wǎng)絡(luò)調(diào)用就可以完成工作分配,從而大大減輕執(zhí)行此操作的網(wǎng)絡(luò)負(fù)載。
2.3裝飾模式
裝飾模式以對客戶透明的方式動(dòng)態(tài)地給一個(gè)對象附加上更多的責(zé)任,換言之,客戶端并不會(huì)覺得對象在裝飾后有什么不同。裝飾模式可以在不使用創(chuàng)造更多子類的情況下,將對象的功能加以擴(kuò)展[4]。
在電子政務(wù)中,由于公文處理業(yè)務(wù)的復(fù)雜性造成了公文表單的多樣性,而不可能對不同類型的公文表單都采取繼承的方式。在本系統(tǒng)中,公文表單基本上分為管理類型(可以創(chuàng)建、修改業(yè)務(wù)對象)、瀏覽類型(只讀方式輸出業(yè)務(wù)對象)、統(tǒng)計(jì)類型(表單中嵌入算法來對業(yè)務(wù)對象進(jìn)行統(tǒng)計(jì))三種。但是如果對于用戶的特殊要求,就需要采用Decorator模式進(jìn)行處理,如黨委辦用戶可能要求在黨委發(fā)布公告表單上顯示一個(gè)政府所有部門的表,以針對性地發(fā)布公文。顯然,采用簡單的繼承方式而把這類特殊的表單歸入管理類型是不合理的,所以就需要利用Decorate模式對這種額外的功能(發(fā)文部門表)進(jìn)行封裝[5]。如圖4所示,Component給出一個(gè)抽象接口,以規(guī)范準(zhǔn)備接收擴(kuò)展功能的對象;ConcreteComponent定義一個(gè)接收擴(kuò)展功能的類;Decorator類是Component類的實(shí)例;ConcreteDecorator類實(shí)現(xiàn)具體的擴(kuò)展功能(如實(shí)現(xiàn)發(fā)文部門表)。為了實(shí)現(xiàn)即插即用,Decorator類提供了即插即用的方法,在運(yùn)行期間決定何時(shí)增加何種功能,通過繼承關(guān)系將這些擴(kuò)展功能下移,從而完成Decorator模式。
2.4工廠模式
政府部門的檔案管理需要接收來自不同部門的檔案信息,各個(gè)部門上報(bào)的檔案具有不同的格式,包括圖片、文檔、表格、視頻等,在過濾、重歸類、相關(guān)性等分析中也有各自不同的處理。平臺(tái)首先需要將不同的檔案規(guī)范地轉(zhuǎn)換為平臺(tái)統(tǒng)一定義的格式,然后根據(jù)檔案的不同來源采用不同的處理流程對檔案進(jìn)行分析,再存放到數(shù)據(jù)庫中,并上報(bào)到客戶端顯示。所以,不同的檔案有不同的處理流程,但都有共同的接口,為解決這個(gè)問題,在檔案管理中采用了工廠模式。工廠模式專門負(fù)責(zé)將大量有共同接口的類實(shí)例化,而且不必事先知道每次是要實(shí)例化哪一個(gè)類。雖然使用工廠模式需要在設(shè)計(jì)中增加一些類,但卻為系統(tǒng)結(jié)構(gòu)提供了非常靈活強(qiáng)大的動(dòng)態(tài)擴(kuò)展機(jī)制。圖5說明了在歸檔過程中工廠模式根據(jù)情況創(chuàng)建不同的類,從而完成對不同格式檔案信息的處理。
2.5設(shè)計(jì)模式組合結(jié)構(gòu)
小城鎮(zhèn)電子政務(wù)系統(tǒng)需要的數(shù)據(jù)類型是多樣化的,數(shù)據(jù)源既可以是各RDBMSR數(shù)據(jù)庫、OODBMS,也可以是XML文件等,而且數(shù)據(jù)持久性存儲(chǔ)是使用不同的機(jī)制實(shí)現(xiàn)的。用來訪問這些不同的持久性存儲(chǔ)機(jī)制的API也有很大的不同,既有實(shí)體Bean的分布式組件來表示持久性數(shù)據(jù),如檔案數(shù)據(jù)、土地資源數(shù)據(jù)等,也有使用JDBCAPI來訪問駐留在關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)中的數(shù)據(jù),如公文流轉(zhuǎn)數(shù)據(jù)、上級審批數(shù)據(jù)等。這些組件中包含連接性和數(shù)據(jù)訪問代碼,引起這些組件與數(shù)據(jù)源實(shí)現(xiàn)之間的緊密耦合,組件中這類代碼的依賴性使應(yīng)用程序從某種數(shù)據(jù)源遷移到其他種類的數(shù)據(jù)源將變得非常麻煩和困難。當(dāng)數(shù)據(jù)源變化時(shí),組件也需要改變,以便于能夠處理新類型的數(shù)據(jù)源。我們使用DAO(DataAccessObject)模式、工廠模式、VO(值對象)模式實(shí)現(xiàn)了對數(shù)據(jù)庫的訪問及操作。采用這些模式進(jìn)行組合可以完全分離業(yè)務(wù)應(yīng)用程序與程序中使用的數(shù)據(jù)源,只要知道數(shù)據(jù)訪問的API,用簡單的接口就可以實(shí)現(xiàn)對數(shù)據(jù)的讀取和操作。
其中DAO抽取該業(yè)務(wù)對象的低層數(shù)據(jù)訪問實(shí)現(xiàn),這些數(shù)據(jù)庫可以是Oracle,SQLServer,MySQL等。用Factory來建立數(shù)據(jù)庫和定位具體的DAO,并建立統(tǒng)一的接口從而實(shí)現(xiàn)對數(shù)據(jù)源的透明訪問。VO(值對象)主要用作數(shù)據(jù)攜帶著的值對象,包裝從數(shù)據(jù)庫中讀取和發(fā)送到數(shù)據(jù)庫的數(shù)據(jù)。同時(shí)系統(tǒng)數(shù)據(jù)庫表多、操作繁雜,通過VO值對象模式提供的粗粒度訪問把所有層都集成起來,在表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)層之間來回傳遞數(shù)據(jù),大大減少了網(wǎng)絡(luò)開銷。組織結(jié)構(gòu)如圖6所示。
底層用DAO實(shí)現(xiàn)對數(shù)據(jù)庫訪問后,通過DAOFactory統(tǒng)一封裝DAO訪問數(shù)據(jù)庫的接口。
Connectionconn=DAOFacotry.createConnection()//封裝數(shù)據(jù)源
然后把Driver,URL以及數(shù)據(jù)庫的Username,Passpword寫在不同的DAO中,以后要更改數(shù)據(jù)庫的類型,如要把MySQL換成Oracle的話,只需要更改DAOFacory中的getConnection()參數(shù)就可以了。
同時(shí)只要通過調(diào)用DAOFactoryMyDaoFactory=DAOFactory.getInstance(),即使不知道DAOFactory中的具體實(shí)現(xiàn),也可以獲得對數(shù)據(jù)庫的操作方法,實(shí)現(xiàn)了對數(shù)據(jù)源的透明訪問。并且當(dāng)需要添加新的數(shù)據(jù)庫類型時(shí),只要修改DAOFactory類中的工廠方法及相應(yīng)的DAO,絲毫不影響客戶端程序,真正體現(xiàn)了面向接口編程,使得系統(tǒng)具有很好的擴(kuò)展性。
3結(jié)束語
為了適應(yīng)小城鎮(zhèn)特殊性,借鑒成功的開發(fā)經(jīng)驗(yàn)是必不可少的。設(shè)計(jì)模式可以更簡單方便地復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu),有利于系統(tǒng)復(fù)用的選擇,避免設(shè)計(jì)損害了系統(tǒng)的復(fù)用性。該系統(tǒng)已在實(shí)際應(yīng)用中取得良好的效果。進(jìn)一步的工作是在更多的實(shí)際應(yīng)用中考察該系統(tǒng)的通用性、正確性、可復(fù)用性和可擴(kuò)展性,使整個(gè)設(shè)計(jì)發(fā)展成為一個(gè)完善的小城鎮(zhèn)電子政務(wù)解決方案。
參考文獻(xiàn):
[1]蘇新寧,吳鵬,朱曉峰,等.電子政務(wù)技術(shù)[M].北京:國防工業(yè)出版社,2003.236256.
[2][美]CraigABerry,JohnCarnellMatjaz.J2EE核心模式[M].北京:機(jī)械工業(yè)出版社,2002.96102.
[3][美]AlurD.J2EE核心模式[M].北京:機(jī)械工業(yè)出版社,2002.125136.
[4][美]ShallowayA,TrottJ.設(shè)計(jì)模式精解:面向?qū)ο笤O(shè)計(jì)的新視角[M].透明.北京:清華大學(xué)出版社,2002.6876.
[5]于淼,李懷明,王延章.行為型設(shè)計(jì)模式在公文表單處理中的應(yīng)用[J].計(jì)算機(jī)工程,2004,30(3):1416.
作者簡介:
丁振蘭(1980),女,湖南株洲人,碩士,主要研究方向?yàn)檗r(nóng)業(yè)信息化、人工智能;吳華瑞(1975),男,山東冠縣人,博士,研究方向?yàn)槿斯ぶ悄?、分布式?jì)算技術(shù);趙春江(1964),男,河北人,博士生導(dǎo)師,農(nóng)業(yè)信息化領(lǐng)域?qū)<?,研究方向?yàn)檗r(nóng)業(yè)信息化、人工智能。