2011軟考軟件設(shè)計(jì)師知識(shí)點(diǎn):設(shè)計(jì)模式與Java
什么是設(shè)計(jì)模式
20世紀(jì)60年代的軟件危機(jī)使得人們開(kāi)始重視軟件工程的研究。起初,人們把軟件設(shè)計(jì)的重點(diǎn)放在數(shù)據(jù)結(jié)構(gòu)和算法的選擇上。隨著軟件系統(tǒng)規(guī)模越來(lái)越大、越來(lái)越復(fù)雜,整個(gè)系統(tǒng)的結(jié)構(gòu)和規(guī)格說(shuō)明也顯得越來(lái)越重要。面對(duì)日益復(fù)雜的軟件系統(tǒng),人們開(kāi)始認(rèn)識(shí)到,要真正實(shí)現(xiàn)軟件的工業(yè)化生產(chǎn)方式,達(dá)到軟件產(chǎn)業(yè)發(fā)展所需要的軟件生產(chǎn)率和質(zhì)量,軟件復(fù)用是一條現(xiàn)實(shí)可行的途徑。
1995年,《Design Pattern》(中譯“設(shè)計(jì)模式”)一書(shū)問(wèn)世,成為面向?qū)ο缶幊讨惺褂媚J交椒ǖ拈_(kāi)創(chuàng)性著作。這本書(shū)對(duì)于軟件實(shí)踐中的一些不斷變換面孔重復(fù)出現(xiàn)、但特征和解決方案的本質(zhì)卻十分類(lèi)似的問(wèn)題進(jìn)行了總結(jié)歸納,提煉出23個(gè)具有代表性的模式。設(shè)計(jì)模式本身并不是一種具體的“技術(shù)”,它講述的是思想。它不僅僅展示了接口或抽象類(lèi)在實(shí)際案例中的靈活應(yīng)用和智慧,還讓開(kāi)發(fā)人員能夠真正掌握接口或抽象類(lèi)的應(yīng)用。更重要的是,該書(shū)提煉的這些設(shè)計(jì)模式反復(fù)強(qiáng)調(diào)的宗旨是盡量提高程序的使用率,讓程序盡可能的可重用。
Java中的設(shè)計(jì)模式
Java語(yǔ)言作為面向?qū)ο缶幊陶Z(yǔ)言的優(yōu)秀代表,它擁有簡(jiǎn)單易用的特性,以及強(qiáng)大的功能,非常有利于設(shè)計(jì)模式的實(shí)施。Java發(fā)展到現(xiàn)在,按應(yīng)用主要分為三大塊:J2SE、J2ME和J2EE,這也就是Sun ONE(Open Net Environment)體系。J2SE就是Java2的標(biāo)準(zhǔn)版,主要用于桌面應(yīng)用軟件的編程;J2ME主要應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā),如手機(jī)和PDA的編程;J2EE是Java2的企業(yè)版,主要用于大型分布式網(wǎng)絡(luò)程序的開(kāi)發(fā),如電子商務(wù)網(wǎng)站和ERP系統(tǒng)。Java技術(shù)已經(jīng)逐漸成為電子商務(wù)主流技術(shù)之一。在Java的各個(gè)平臺(tái)中,設(shè)計(jì)模式有很多精彩的應(yīng)用,而且隨著Java技術(shù)的不斷發(fā)展,設(shè)計(jì)模式也在不斷豐富。
J2SE與設(shè)計(jì)模式
早期發(fā)布的設(shè)計(jì)模式主要來(lái)自桌面應(yīng)用軟件的開(kāi)發(fā)經(jīng)驗(yàn)。在《Design Pattern》一書(shū)中,所有的模式都是通過(guò)面向桌面應(yīng)用的窗口程序來(lái)舉例說(shuō)明的。相應(yīng)的在J2SE中,貫穿了設(shè)計(jì)模式的思想,尤其是大量運(yùn)用了MVC模式。
所謂MVC模式,是指模型(Model)、視圖(View)和控制(Control)相分離的設(shè)計(jì)方案。模型(Model)是執(zhí)行某些任務(wù)的代碼。至于這些任務(wù)以什么形式顯示給用戶(hù),卻并不是模型所關(guān)注的問(wèn)題。模型只有純粹的功能性的接口,也就是一系列的公開(kāi)方法。這些方法有的是取值方法,讓系統(tǒng)其它部分可以得到模型端的內(nèi)部狀態(tài)參數(shù);有的是改值方法,允許外部修改模型的內(nèi)部狀態(tài)。
視圖決定模型以什么樣的方式顯示給用戶(hù)。一個(gè)模型可以對(duì)應(yīng)多個(gè)視圖,那么對(duì)于視圖而言,模型就是可重用的代碼。一般來(lái)說(shuō),模型內(nèi)部必須留下所有對(duì)應(yīng)視圖的記錄,以便在模型的狀態(tài)發(fā)生改變的時(shí)候,可以通知視圖。模型的狀態(tài)一旦發(fā)生改變,所有對(duì)應(yīng)的視圖都能夠得到更新。
控制是和視圖聯(lián)合使用的。用戶(hù)在與視圖發(fā)生交互的時(shí)候,是通過(guò)控制器來(lái)操縱模型,從而向模型傳遞數(shù)據(jù)、更新模型的狀態(tài)。
例如,一個(gè)表格數(shù)據(jù)體可以看作是一個(gè)模型,它可以對(duì)應(yīng)成為多種視圖,比如餅圖、棒圖或者直接顯示成為一個(gè)表格。用戶(hù)通過(guò)鍵盤(pán)和鼠標(biāo)與視圖進(jìn)行交互,從而激發(fā)相應(yīng)的控制器改變表格數(shù)據(jù)。一旦表格數(shù)據(jù)發(fā)生變化,視圖會(huì)得到通知,進(jìn)而更新顯示的形式。
MVC模式是最著名的模式之一。J2SE中一些復(fù)雜的顯示控件(如表格、列表、樹(shù)等),都使用了這種模式,從而使得設(shè)計(jì)結(jié)構(gòu)非常清晰而且靈活。當(dāng)然,也有人提出,MVC模式不應(yīng)當(dāng)被稱(chēng)為“設(shè)計(jì)模式”,而應(yīng)當(dāng)屬于“架構(gòu)模式”。它可以看作若干個(gè)設(shè)計(jì)模式的組合,并且在不同的應(yīng)用環(huán)境中衍生出了其它的一些設(shè)計(jì)模式。但是在各種討論中,MVC模式還是常常被當(dāng)作設(shè)計(jì)模式。
J2EE與設(shè)計(jì)模式
J2EE屬于一種框架軟件。什么是框架軟件?它不同于以前接觸的Java API等,那些API屬于Toolkit(工具箱)。而J2EE不再被動(dòng)地被使用、被調(diào)用,而是深刻地介入到一個(gè)領(lǐng)域中去。J2EE設(shè)計(jì)的目的是將企業(yè)計(jì)算應(yīng)用領(lǐng)域中不變的東西先定義好,比如整體結(jié)構(gòu)和一些主要職責(zé)(如數(shù)據(jù)庫(kù)操作、事務(wù)跟蹤和安全等),剩余的就是變化的東西,即針對(duì)這個(gè)領(lǐng)域中具體應(yīng)用所產(chǎn)生的不同的變化需求,而這些變化的東西就是J2EE程序員所要做的。因此,設(shè)計(jì)模式和J2EE在思想和動(dòng)機(jī)上是一脈相承的。只不過(guò)設(shè)計(jì)模式更抽象,幾乎可以用于任何應(yīng)用;J2EE則是適合企業(yè)計(jì)算應(yīng)用的框架軟件,而設(shè)計(jì)模式是它的重要的理論基礎(chǔ)之一。
與此同時(shí),在J2EE的框架下,一些應(yīng)用級(jí)的設(shè)計(jì)模式也逐步積累了起來(lái),關(guān)于設(shè)計(jì)模式在J2EE中的應(yīng)用已成為許多論壇討論的熱點(diǎn)之一。其中,J2EE Web應(yīng)用的架構(gòu)設(shè)計(jì)引起了高度的關(guān)注。J2EE體系包括JSP、Servlet、EJB、Web服務(wù)等多項(xiàng)技術(shù)。這些技術(shù)的出現(xiàn)給電子商務(wù)時(shí)代的Web應(yīng)用開(kāi)發(fā)提供了一個(gè)非常有競(jìng)爭(zhēng)力的選擇。怎樣把這些技術(shù)組合起來(lái),形成一個(gè)適應(yīng)項(xiàng)目需要的穩(wěn)定架構(gòu)是項(xiàng)目開(kāi)發(fā)過(guò)程中非常重要的步驟。此步驟一般由架構(gòu)設(shè)計(jì)師完成,設(shè)計(jì)師根據(jù)項(xiàng)目需求,對(duì)J2EE體系中的各種技術(shù)進(jìn)行篩選取舍,并考慮到開(kāi)發(fā)過(guò)程中的角色分工、后期的運(yùn)行維護(hù),以及系統(tǒng)擴(kuò)展性等諸多因素建立系統(tǒng)的架構(gòu)。一個(gè)成功的軟件需要有一個(gè)成功的架構(gòu),但軟件架構(gòu)的建立是一個(gè)復(fù)雜而又持續(xù)改進(jìn)的過(guò)程,軟件開(kāi)發(fā)者們不可能對(duì)每個(gè)不同的項(xiàng)目做不同的架構(gòu),而總是盡量重用以前的架構(gòu),或開(kāi)發(fā)出盡量通用的架構(gòu)方案。
在當(dāng)前的J2EE Web應(yīng)用中,Apache Struts是最流行的架構(gòu)方案之一。它實(shí)現(xiàn)了MVC模式的概念,并將這些概念映射到Web應(yīng)用程序的構(gòu)件和概念中。Struts這個(gè)名字來(lái)源于在建筑和舊式飛機(jī)中使用的支持金屬架,其目的是幫助開(kāi)發(fā)人員減少在運(yùn)用MVC設(shè)計(jì)模型開(kāi)發(fā)Web應(yīng)用的時(shí)間。
Apache Struts有以下的優(yōu)點(diǎn):一些開(kāi)發(fā)商開(kāi)始采用并推廣這個(gè)框架;作為開(kāi)源項(xiàng)目,有很多先進(jìn)的實(shí)現(xiàn)思想;對(duì)大型應(yīng)用支持的較好;有集中的網(wǎng)頁(yè)導(dǎo)航定義。Apache Struts正在獲得越來(lái)越多的關(guān)注與支持。
J2ME與設(shè)計(jì)模式
J2ME標(biāo)準(zhǔn)為消費(fèi)類(lèi)產(chǎn)品(例如移動(dòng)電話(huà)、雙向傳呼機(jī)和無(wú)線個(gè)人信息管理器)的應(yīng)用開(kāi)發(fā)提供支持。這一類(lèi)產(chǎn)品的特點(diǎn)是,顯示能力和存儲(chǔ)能力有限,計(jì)算能力和網(wǎng)絡(luò)訪問(wèn)能力不夠強(qiáng)大。因此,J2ME設(shè)計(jì)模式就有了它所獨(dú)特的問(wèn)題領(lǐng)域。比如,如果需要顯示比較大的數(shù)據(jù)集合,那么應(yīng)該采取什么樣的解決方案,才能適應(yīng)狹小的顯示區(qū)域?又比如,如果需要實(shí)現(xiàn)類(lèi)似桌面軟件的選單選擇的功能,那么應(yīng)該如何設(shè)計(jì)才能夠足夠簡(jiǎn)練和便于重用?J2ME的設(shè)計(jì)模式正在逐步的積累過(guò)程中,我們相信隨著J2ME的推廣J2ME設(shè)計(jì)模式的討論也將逐步成為一大關(guān)注熱點(diǎn)。
Java與設(shè)計(jì)模式的結(jié)合,為Java的發(fā)展帶來(lái)了更大的活力,也為設(shè)計(jì)模式提供了一個(gè)寬闊的舞臺(tái)。在這些技術(shù)的共同推動(dòng)下,軟件產(chǎn)業(yè)將以堅(jiān)實(shí)的步伐走進(jìn)工業(yè)化時(shí)代。
【編輯推薦】