摘要:設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。文中對(duì)MVC模式、單例模式和頁(yè)面控制器的概念進(jìn)行了探討,并在工作任務(wù)管理系統(tǒng)進(jìn)行了實(shí)現(xiàn)。
關(guān)鍵詞:設(shè)計(jì)模式 MVC 單例模式 頁(yè)面控制器
0 引言
軟件項(xiàng)目開(kāi)發(fā)的一個(gè)難點(diǎn)是用戶需求的變化導(dǎo)致后期功能代碼的擴(kuò)展和維護(hù),軟件項(xiàng)目管理的一個(gè)難點(diǎn)是團(tuán)隊(duì)成員間的協(xié)作和溝通。設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編寫的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。遵循設(shè)計(jì)模式的解決方案,有助于功能的擴(kuò)展和代碼的維護(hù)。設(shè)計(jì)模式是面向?qū)ο蟪绦蛟O(shè)計(jì)的精華,讓對(duì)象和對(duì)象的關(guān)系清晰了起來(lái),使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設(shè)計(jì)模式是按場(chǎng)景進(jìn)行分類,便于團(tuán)隊(duì)間的溝通。本文以工作任務(wù)管理系統(tǒng)為例,討論幾種常用軟件模式在信息管理系統(tǒng)開(kāi)發(fā)中的應(yīng)用。
1 設(shè)計(jì)模式分析
1.1 MVC模式 MVC是個(gè)將一個(gè)應(yīng)用的實(shí)現(xiàn)分成三個(gè)組件角色的框架技術(shù):模型,視圖和控制器。①在基于MVC的應(yīng)用里,Model(模型)是負(fù)責(zé)保持狀態(tài)的應(yīng)用組件。這個(gè)狀態(tài)通常都持久于數(shù)據(jù)庫(kù)之中(譬如,我們也許會(huì)有一個(gè)Product(產(chǎn)品)類用來(lái)代表SQL中的Products數(shù)據(jù)表中的訂單數(shù)據(jù))。②在基于MVC的應(yīng)用里,View(視圖)是負(fù)責(zé)顯示用戶界面的組件。這個(gè)UI通常是使用模型數(shù)據(jù)來(lái)創(chuàng)建的(譬如,我們也許會(huì)生成一個(gè)Product“編輯”視圖,根據(jù)當(dāng)前Product對(duì)象的狀態(tài),顯示文本框,下拉框和復(fù)選框等)。③在基于MVC的應(yīng)用里,Controller(控制器)是處理用戶交互,操作模型和最終選擇用哪個(gè)視圖來(lái)顯示UI的組件。在MVC應(yīng)用中,視圖只是用來(lái)顯示信息而已,是控制器來(lái)處理和回應(yīng)用戶的輸入和交互的。使用MVC方法的一個(gè)好處是,它有助于促進(jìn)應(yīng)用中模型,視圖,控制器間的關(guān)注的清晰分離。保持關(guān)注的清晰分離使得對(duì)應(yīng)用的測(cè)試極其容易,因?yàn)椴煌瑧?yīng)用組件間的契約的定義和表達(dá)是更明確的。
1.2 頁(yè)面控制器 使用頁(yè)面控制器模式接受來(lái)自頁(yè)面請(qǐng)求的輸入、調(diào)用請(qǐng)求對(duì)模型執(zhí)行的操作以及確定應(yīng)用于結(jié)果頁(yè)面的正確視圖。分隔調(diào)度邏輯和所有視圖相關(guān)代碼。如果合適,創(chuàng)建用于所有頁(yè)面控制器的公用基類,以避免代碼重復(fù)并提高一致性和可測(cè)試性。頁(yè)面控制器可接收頁(yè)面請(qǐng)求、提取所有相關(guān)數(shù)據(jù)、調(diào)用對(duì)模型的所有更新以及向視圖轉(zhuǎn)發(fā)請(qǐng)求。而視圖又將根據(jù)該模型檢索要顯示的數(shù)據(jù)。定義獨(dú)立頁(yè)面控制器將分隔模型與Web請(qǐng)求細(xì)節(jié)(例如會(huì)話管理,或使用查詢字符串或隱藏表單域向頁(yè)面?zhèn)鬟f參數(shù))。
1.3 單例模式 單例模式的特點(diǎn):①單例類只能有一個(gè)實(shí)例;②單例類必須自己創(chuàng)建自己的唯一實(shí)例;③單例類必須給所有其它對(duì)象提供這一實(shí)例。
Singleton模式包含的角色只有一個(gè),就是Singleton。Singleton擁有一個(gè)私有構(gòu)造函數(shù),確保用戶無(wú)法通過(guò)new直接實(shí)例它。除此之外,該模式中包含一個(gè)靜態(tài)私有成員變量instance與靜態(tài)公有方法Instance()。Instance方法負(fù)責(zé)檢驗(yàn)并實(shí)例化自己,然后存儲(chǔ)在靜態(tài)成員變量中,以確保只有一個(gè)實(shí)例被創(chuàng)建。
2 工作任務(wù)管理系統(tǒng)的設(shè)計(jì)模式應(yīng)用
2.1 工作任務(wù)管理系統(tǒng)體系結(jié)構(gòu) 工作任務(wù)管理系統(tǒng)的體系結(jié)構(gòu)如圖1所示,圖中的箭頭表明了信賴關(guān)系。在物理上,DAL是公共的數(shù)據(jù)訪問(wèn)入口層,BLL用來(lái)封閉業(yè)務(wù)實(shí)體對(duì)象,BIN是經(jīng)過(guò)編譯后的邏輯控制代碼,Web文件夾下是按功能劃分的視圖文件。用戶與《View》下的視圖文件進(jìn)行交互,控制數(shù)據(jù)的顯示和接受用戶的輸入;《View》中的數(shù)據(jù)來(lái)源于《Controller》,《Controller》負(fù)責(zé)維護(hù)《View》的狀態(tài)和數(shù)據(jù)的呈現(xiàn),以及將《View》傳遞過(guò)來(lái)的數(shù)據(jù)對(duì)象化,并調(diào)用對(duì)象方法實(shí)現(xiàn)相應(yīng)的業(yè)務(wù)邏輯獲得數(shù)據(jù);《Model》中包含實(shí)體的集合,對(duì)應(yīng)于業(yè)務(wù)規(guī)則,是數(shù)據(jù)庫(kù)表數(shù)據(jù)和數(shù)據(jù)增、刪、改、查操作的抽象,實(shí)體以類的形式存在,業(yè)務(wù)以類方法的形式進(jìn)行實(shí)現(xiàn),《Model》從業(yè)務(wù)規(guī)則的層面處理數(shù)據(jù),它是《Controller》數(shù)據(jù)的供應(yīng)商。
工作任務(wù)管理系統(tǒng)中使用了MVC結(jié)構(gòu)后,在開(kāi)發(fā)時(shí),項(xiàng)目組成員間職責(zé)明確,美工和網(wǎng)頁(yè)設(shè)計(jì)師只需要關(guān)注《View》的設(shè)計(jì)和HTML實(shí)現(xiàn);數(shù)據(jù)庫(kù)設(shè)計(jì)人員只需要關(guān)心數(shù)據(jù)庫(kù)的設(shè)計(jì)以及數(shù)據(jù)的轉(zhuǎn)換規(guī)則;模型人員只需要從業(yè)務(wù)的角度關(guān)注業(yè)務(wù)規(guī)則的實(shí)現(xiàn)和從數(shù)據(jù)庫(kù)到實(shí)現(xiàn)對(duì)象的轉(zhuǎn)換工作;而程序只需要關(guān)注利用模型的業(yè)務(wù)規(guī)則控制處理《View》的數(shù)據(jù)顯示和輸入就可以了。這樣做,非常有利于項(xiàng)目的管理和分工協(xié)作。
另外,到了開(kāi)發(fā)的后期,需求分析的變化,導(dǎo)致業(yè)務(wù)規(guī)則的重整,只需要在現(xiàn)在代碼基礎(chǔ)上增加一些實(shí)體類就可以了,便于系統(tǒng)的擴(kuò)展。
2.2 頁(yè)面控制器 在工作任務(wù)管理系統(tǒng)中,《View》分為兩種,一種是無(wú)需授權(quán)任何人都可以訪問(wèn)的頁(yè)面,稱之為通用頁(yè);一種是需要用戶登錄,特定用戶才有權(quán)訪問(wèn)的頁(yè)面,稱之授權(quán)頁(yè)?!禫iew》只是簡(jiǎn)單的以HTML的方式顯示,由瀏覽器解析,否能訪問(wèn)由頁(yè)面控制器來(lái)控制的,即《View》對(duì)應(yīng)的后臺(tái)代碼。在默認(rèn)情況下,所有的布面控制器都繼承于System.Web.UI.Page類,要實(shí)現(xiàn)權(quán)限控制必須在所有的頁(yè)面控制添加控制代碼,這用做非常的麻煩,而且不利于代碼的后期修改和擴(kuò)展。針對(duì)于這種需求,頁(yè)面控制器設(shè)計(jì)模式提供了一種非常好的解決方案,如圖2所示。
定義一個(gè)基類BasePage,繼承于System.Web.UI.Page,是系統(tǒng)中所有頁(yè)面控制器的基礎(chǔ);從BasePage下派生出GenPage和AuthPage兩個(gè)類,分別用作于通用頁(yè)和授權(quán)頁(yè)的父類。在授權(quán)頁(yè)的構(gòu)造函數(shù)中,實(shí)現(xiàn)OnLoad事件的訂閱,在OnLoad的事件處理程序中添加權(quán)限控制代碼,所有的授權(quán)頁(yè)都從AuthPage派生出來(lái),這樣在派生頁(yè)控制器中,就無(wú)需寫權(quán)限控制代碼了。在后期代碼的擴(kuò)展過(guò)程中,只需有修改父類的代碼就可以,而不是每個(gè)頁(yè)控制器的代碼。
2.3 單例的數(shù)據(jù)連接對(duì)象 數(shù)據(jù)連接是系統(tǒng)中非常寶貴的資源,如果一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中存在著多個(gè)連接對(duì)象,并且這些對(duì)象沒(méi)有及時(shí)釋放,系統(tǒng)的性能將會(huì)急劇下降。一個(gè)好的設(shè)計(jì)是,在一個(gè)系統(tǒng)中數(shù)據(jù)連接應(yīng)該是唯一的,單例的,如圖3所示。Cnn是DBAccess的一個(gè)靜態(tài)成員,并在靜態(tài)構(gòu)造函數(shù)實(shí)例化。這樣,不論DBAccess有多少個(gè)對(duì)象,數(shù)據(jù)連接對(duì)象便只有一個(gè)了。
3 結(jié)論
設(shè)計(jì)模式是設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),在系統(tǒng)設(shè)計(jì)過(guò)程中合理地使用一些經(jīng)典的設(shè)計(jì)模式,是十分有利于系統(tǒng)功能的擴(kuò)展和代碼復(fù)用的。在工作任務(wù)管理系統(tǒng)中,MVC模式使得系統(tǒng)的結(jié)構(gòu)清晰,有利團(tuán)隊(duì)的分工合作;頁(yè)面控制器模式降低了代碼的冗余度,提高了代碼的重用性,方便了功能的擴(kuò)展;單例模式實(shí)現(xiàn)了數(shù)據(jù)連接的唯一性,提高了系統(tǒng)的性能。
參考文獻(xiàn):
[1]鐘金琴,辜麗川.一種面向?qū)ο蟮能浖O(shè)計(jì)模式庫(kù)的設(shè)計(jì).計(jì)算機(jī)技術(shù)與發(fā)展[J],2008.(9):22.
[2]Microsoft,表示層設(shè)計(jì)模式:Page Controller(頁(yè)面控制器)[OL]. http://www.uml.org.cn/sjms/200812302.asp,2008-12-30.