李建東
(蒙自市智慧城市運(yùn)營管理中心 云南省蒙自市 661199)
根據(jù)上級領(lǐng)導(dǎo)的安排,我組織我們單位的技術(shù)人員和軟件公司的技術(shù)人員為市政府開發(fā)一套OA 系統(tǒng),該系統(tǒng)的使用范圍為全市所有單位,該系統(tǒng)通過接口可以與州級的OA 系統(tǒng)實現(xiàn)互聯(lián)。該系統(tǒng)包括辦公管理、發(fā)文管理、收文管理、檔案管理、個人事務(wù)、圖書管理、信息管理、會議管理以及車輛管理等功能。在該系統(tǒng)的開發(fā)中我擔(dān)任系統(tǒng)架構(gòu)設(shè)計師(項目負(fù)責(zé)人)的角色,主要負(fù)責(zé)系統(tǒng)架構(gòu)設(shè)計和需求分析的工作。
軟件體系結(jié)構(gòu)風(fēng)格是描述某一特定應(yīng)用領(lǐng)域中系統(tǒng)組織方式的慣用模式。組織方式描述了系統(tǒng)的組成構(gòu)件和這些構(gòu)件的組織方式。慣用模式則反映眾多系統(tǒng)共有的結(jié)構(gòu)和語義。按照Shaw 和Garlan的分類,軟件體系結(jié)構(gòu)風(fēng)格分為5 類,其中:
(1)數(shù)據(jù)流風(fēng)格,包括批處理序列風(fēng)格和管道過濾器風(fēng)格。
(2)調(diào)用/返回風(fēng)格,包括主程序/子程序風(fēng)格、數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格、分層系統(tǒng)風(fēng)格。
(3)獨立構(gòu)件風(fēng)格,包括進(jìn)程通信風(fēng)格、事件驅(qū)動系統(tǒng)風(fēng)格。
(4)虛擬機(jī)風(fēng)格,包括解釋器風(fēng)格和基于規(guī)則的系統(tǒng)。
(5)倉庫風(fēng)格,包括數(shù)據(jù)庫風(fēng)格、黑板系統(tǒng)風(fēng)格、超文本系統(tǒng)風(fēng)格。
除了上述5 種風(fēng)格外比較常用的一種風(fēng)格是分布式架構(gòu)風(fēng)格,它包括客戶機(jī)/服務(wù)器(C/S)風(fēng)格、瀏覽器/服務(wù)器(B/S)風(fēng)格。
在管道/過濾器風(fēng)格中,每個構(gòu)件都有一組輸入和輸出,數(shù)據(jù)輸入構(gòu)件,經(jīng)過處理以后,產(chǎn)生數(shù)據(jù)輸出。所以,構(gòu)件被稱為過濾器,而這種風(fēng)格中的連接件就好像是數(shù)據(jù)流傳輸?shù)墓艿馈nix 中shell程序的編寫以及編譯器主要應(yīng)用了這種風(fēng)格。在數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格中,數(shù)據(jù)的表示方法和對它們的相應(yīng)操作被封裝在一個對象或抽象數(shù)據(jù)類型當(dāng)中,在這種風(fēng)格中構(gòu)件是對象,或者說是抽象數(shù)據(jù)類型的實例。而對象間交互的方式是連接件,對象是通過函數(shù)和過程調(diào)用來進(jìn)行交互的。數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格的應(yīng)用十分的廣泛,現(xiàn)在面向?qū)ο蟮南到y(tǒng)都屬于這種風(fēng)格,它經(jīng)常與其它架構(gòu)風(fēng)格一起使用。在事件驅(qū)動系統(tǒng)中構(gòu)件不直接調(diào)用一個過程,而是廣播或觸發(fā)一個或多個事件。系統(tǒng)中的其它構(gòu)件中的過程在一個或多個事件中注冊。當(dāng)一個事件被觸發(fā),系統(tǒng)自動調(diào)用在這個事件中注冊的所有過程,這樣,一個事件的觸發(fā)就導(dǎo)致了另一個模塊中的過程的調(diào)用。在面向?qū)ο笙到y(tǒng)中的某事件的單擊事件、雙擊事件就應(yīng)用了這種風(fēng)格。在數(shù)據(jù)庫系統(tǒng)風(fēng)格中,構(gòu)件主要有兩類,一類是中央共亨數(shù)據(jù)源,保存當(dāng)前系統(tǒng)的數(shù)據(jù)狀態(tài);另一類是多個獨立處理單元,處理單元對數(shù)據(jù)元素進(jìn)行操作。它主要應(yīng)用在數(shù)據(jù)庫管理系統(tǒng)中。
設(shè)計模式是人們在長期的開發(fā)實踐中良好經(jīng)驗的結(jié)晶,它提供了一個簡單、統(tǒng)一的描述方法,使人們可以復(fù)用這些軟件設(shè)計方法、過程管理經(jīng)驗。一個設(shè)計模式通常由四部分組成:
(1)模式名。模式名就是給模式取的一個助記名。
(2)問題。描述了應(yīng)該在何時使用模式,即在解決何種問題時可使用該模式。
(3)解決方案。描述設(shè)計的組成成分,它們之間的交互以及職責(zé)的分配。
(4)效果。描述了模式應(yīng)用的效果以及使用模式時應(yīng)權(quán)衡的問題,即模式的優(yōu)缺點。按照目的和用途的不同,設(shè)計模式可分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式三種。創(chuàng)建型模式主要用于創(chuàng)建對象。結(jié)構(gòu)型模式主要用于處理類或?qū)ο蟮慕M合。行為型模式主要用于描述類或?qū)ο蟮慕换ヒ约奥氊?zé)的分配。其中創(chuàng)建型模式包括:工廠方法、抽象工廠、原型模式、單例模式、建造者模式。結(jié)構(gòu)型模式包括:適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、亨元模式、代理模式。行為型模式包括:職責(zé)鏈模式、命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、觀察者模式、狀態(tài)模式、策略模式、模板方法、訪問者模式。
適配器模式將一個類的接口轉(zhuǎn)換成客戶需要的另外一個接口,從而使接口不兼容的類可以相互調(diào)用。橋接模式將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。組合模式將對象組合成樹形結(jié)構(gòu)以表示“整體—部分”的層次結(jié)構(gòu)。組合模式使得用戶對單個對象和組合對象的使用具有一致性。裝飾模式可以動態(tài)地給一個對象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活。外觀模式為子系統(tǒng)的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。中介者模式用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其松散耦合。
通過對OA 系統(tǒng)需求的獲取和分析,我們知道該系統(tǒng)的用戶主要有兩類,一類是辦公室用戶,他們在辦公室里通過局域網(wǎng)使用OA,而另一類用戶是外出用戶,他們通過Internet 使用OA,而管理員有全市系統(tǒng)管理員和單位系統(tǒng)管理員,全市系統(tǒng)管理員可以添加、刪除全市的所有人員,而單位系統(tǒng)管理員可以添加、刪除本單位的所有人員,該系統(tǒng)的主要功能包括辦公管理、收文管理、發(fā)文管理、信息管理、個人事務(wù)、檔案管理、圖書管理、會議管理以及車輛管理等?;谏鲜龅男枨?,我們決定采用C/S 和B/S 的混合架構(gòu)風(fēng)格來設(shè)計整體架構(gòu)。而選擇5 種經(jīng)典架構(gòu)風(fēng)格中的某幾種風(fēng)格來設(shè)計內(nèi)部架構(gòu)。在該系統(tǒng)的整體架構(gòu)設(shè)計中,外出用戶訪問OA系統(tǒng),我們采用了B/S 架構(gòu)。對于外出用戶由瀏覽器通過internet訪問Web 服務(wù)器,通過Web 服務(wù)器再訪問數(shù)據(jù)庫服務(wù)。這樣做的好處在于外出用戶只需要一臺可以上Internet 的計算機(jī)就可以通過瀏覽器使用OA,而無需下載安裝客戶端軟件。出于Internet 網(wǎng)安全性的考慮,我們在Internet 和Web 服務(wù)器之間安裝了一臺VPN網(wǎng)關(guān)。辦公室用戶訪問OA 系統(tǒng),我們采用C/S 架構(gòu)。對于辦公室用戶由客戶端軟件通過局域網(wǎng)直接訪問數(shù)據(jù)庫服務(wù)器。這樣做的好處在于C/S 架構(gòu)的數(shù)據(jù)查詢和修改的響應(yīng)速度較快、交互性較強(qiáng)、網(wǎng)絡(luò)負(fù)載較小。
在該系統(tǒng)中通過采用管道/過濾器風(fēng)格,實現(xiàn)通用收文流程和通用發(fā)文流程之間的對接。在每個單位中,通用收文流程中收到的外單位發(fā)來的公文,可以通過通用收文流程中的選擇發(fā)文類別來選擇所需的發(fā)文類別,如:局長、副局長、某某科室長、所有人員、某某人等,根據(jù)需要也可以多選,然后單擊發(fā)文,該文件便通過通用收文流程接口輸出,通用發(fā)文流程中有相應(yīng)的接口對應(yīng)獲取并分析處理數(shù)據(jù),根據(jù)發(fā)文類別把文件發(fā)到相應(yīng)人員的OA 系統(tǒng)里。通過這種方式減少了文件存儲和轉(zhuǎn)發(fā)、多次人員選擇等的工作量,提高了工作效率。通過采用事件驅(qū)動系統(tǒng),實現(xiàn)了會議安排管理和會議室安排情況、后勤管理的對接。由于整個行政中心的會議室都是共用的,在該系統(tǒng)中會議管理人員只需要按照要求在會議安排管理中輸入?yún)藬?shù)及所需要的軟硬件環(huán)境等,并點確定后,系統(tǒng)將自動調(diào)出符合輸入?yún)l件,并且未被安排的會議室安排情況表,并且自動通知負(fù)責(zé)該會議室的后勤管理人員做好后勤服務(wù)準(zhǔn)備。當(dāng)所有后勤管理人員都確定收到這些消息并做好準(zhǔn)備后,系統(tǒng)將自動出現(xiàn)某某會議室已做好開會的準(zhǔn)備的提示。通過這種方式實現(xiàn)了整個會議安排管理的自動化,無需手動操作更多的內(nèi)容,當(dāng)以后改進(jìn)系統(tǒng)的時候,可以很方便地操作。此外由于該系統(tǒng)是采用面向?qū)ο蟮乃枷脒M(jìn)行的開發(fā),我們在開發(fā)系統(tǒng)時抽取了很多類,如:管理員類、某某市管理員類、某某市某某單位管理員類、用戶類、流程類、發(fā)文流程類、收文流程類等等,類之間通過繼承實現(xiàn)了重用,類通過實例化生成了對象,對象間通過發(fā)送消息進(jìn)行交互,所以該系統(tǒng)大量使用了數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格。該系統(tǒng)的數(shù)據(jù)庫管理系統(tǒng)中使用了數(shù)據(jù)庫系統(tǒng)風(fēng)格實現(xiàn)了數(shù)據(jù)的共亨。該系統(tǒng)在Web 頁面中,使用了超文本系統(tǒng)風(fēng)格實現(xiàn)了構(gòu)件按照人類的思維方式任意跳轉(zhuǎn)。
在該系統(tǒng)開發(fā)中,我們也大量使用了設(shè)計模式,在頁面設(shè)計中使用了裝飾模式,這樣如果用戶對開發(fā)的頁面顯示效果不滿意,通過添加具體裝飾類的方法,可以在不影響其它對象的情況下,動態(tài)的改變頁面的顯示效果,也可以很方便的撤銷原來的顯示效果。在登錄模塊的設(shè)計中,我們采用了外觀模式。登錄模塊根據(jù)用戶輸入的用戶名確定該用戶的類別,它是系統(tǒng)管理員還是一般用戶,是全市的系統(tǒng)管理員還是單位的系統(tǒng)管理員。然后根據(jù)相應(yīng)的用戶類別,選擇相應(yīng)的接口,進(jìn)入相應(yīng)的頁面。
在該系統(tǒng)中,需要對用戶和系統(tǒng)管理員進(jìn)行查找,需要按收發(fā)文條數(shù)對各單位進(jìn)行排序。而這些常用的算法在我們的類庫中都有相應(yīng)的類,為了提高查找和排序的效率,我們決定重用類庫中的快速排序算法類和二分查找算法類。但快速排序算法類和二分查找算法類的接口不是OA 系統(tǒng)所兼容的接口,如果對接口進(jìn)行修改將導(dǎo)致大量代碼的修改。此時我們采用了適配器模式,把快速排序算法類和二分查找算法類的接口適配成OA 系統(tǒng)所兼容的接口。在短信模塊的設(shè)計中,我們使用了中介者模式。在整個模塊中有一個守護(hù)進(jìn)程在一直運(yùn)行,相當(dāng)于一個中介者,用戶是否在線,以及新短信存在與否,這些同事對象都是通過守護(hù)進(jìn)程這個中介者與客戶端發(fā)生交互的。個人事務(wù)的設(shè)計中,使用了組合模式。將對象組合成樹形結(jié)構(gòu)以表示“整體—部分”的層次結(jié)構(gòu)。組合模式使得用戶對單個對象和組合對象的使用具有一致性。在收發(fā)文流程的設(shè)計中,我們使用了職責(zé)鏈模式。使擬稿者、核稿者、簽發(fā)者、發(fā)文者等多個對象都有機(jī)會處理請求,避免了請求的發(fā)送者和接收者之間的耦合關(guān)系。
在該系統(tǒng)的開發(fā)中我們也遇到了一些問題,一是各單位的電腦形形色色,有配置高的,有配置低的,有的電腦甚至用了十年都沒有更換,然而C/S 架構(gòu)中的客戶端軟件既要完成用戶與應(yīng)用間的對話功能,又要處理業(yè)務(wù)邏輯,這種胖客戶端的形式使某些配置低的電腦很難承當(dāng)這種負(fù)載,從而導(dǎo)致響應(yīng)速度慢甚至死機(jī)的現(xiàn)象,后來我們對辦公室用戶OA 的使用采用了三層C/S 架構(gòu),以減輕客戶端的負(fù)載。二是開發(fā)中不要過度使用設(shè)計模式,為了使用設(shè)計模式而使用設(shè)計模式。使用設(shè)計模式的前提是,明確該模式是否符合問題的場景,并且應(yīng)該權(quán)衡利弊,比如使用代理模式能在一定程度上降低系統(tǒng)的耦合度,但缺點是會使請求的處理速度變慢,并且實現(xiàn)代理模式需要額外的工作。在請求處理速度要求高的模塊中,就不適合使用代理模式。
在該項目的開發(fā)中,選用了多種軟件體系結(jié)構(gòu)風(fēng)格及設(shè)計模式。整個系統(tǒng)各個模塊相對獨立,實現(xiàn)了松散耦合,使系統(tǒng)具有很好的開放性、易擴(kuò)展性、易移植性、靈活性。節(jié)省了開發(fā)和維護(hù)成本,提高了系統(tǒng)的開發(fā)效率。