當前位置:
首頁 >
设计模式的实际应用
發(fā)布時間:2025/7/14
46
豆豆
通常,概念和這些概念在現(xiàn)實世界中的應(yīng)用是有區(qū)別的,設(shè)計模式也不例外。
設(shè)計模式無處不在。在閱讀技術(shù)方面的出版物或者瀏覽技術(shù)方面的網(wǎng)站時,很容易發(fā)現(xiàn)對設(shè)計模式的引用。到目前為止,您很可能已經(jīng)閱讀過(至少翻閱過)一 些設(shè)計模式方面的書籍,如《Core J2EE Design Patterns》或者Gang of Four編寫的《Design Patterns》。此時,您可能會對設(shè)計模式有一些疑問。設(shè)計模式如何幫助我?他們是銀彈嗎?使用設(shè)計模式有什么問題嗎?為什么我不能從集成開發(fā)環(huán)境 (integrated development environment,IDE)中獲得設(shè)計模式?
上述的幾個問題是采用設(shè)計模式進行處理過程中遇到的一些經(jīng)典問題。通常,概念和這些概念在顯示世界中的應(yīng)用是有區(qū)別的,設(shè)計模式也不例外。本文將討論設(shè)計模式在現(xiàn)實世界中的應(yīng)用。這些信息可以幫助您成功地在項目中采用設(shè)計模式來作出正確的決定。
快速概述
設(shè)計模式提供了一種共享經(jīng)驗的方式,可以使團體受益和避免不斷的重復發(fā)明。設(shè)計模式通常捕捉問題的描述、問題的語境、推薦的問題解決方案以及使用解決 方案后可以預見到的結(jié)果。為了具有最廣泛的適用性(從而對更多的讀者有用),設(shè)計模式通常從取決于環(huán)境的精確細節(jié)中抽象而來。這種抽象性產(chǎn)生了一些把設(shè)計 模式應(yīng)用到現(xiàn)有的案例中所必需的譯碼。這是一個重要細節(jié):盡管設(shè)計模式是共享專業(yè)知識的好方法,但通常它對正確應(yīng)用專業(yè)知識是非常重要的。
設(shè)計模式這個概念最初產(chǎn)生于建筑行業(yè)。設(shè)計師(設(shè)計建筑物而不是計算機系統(tǒng))意識到他們需要共享有關(guān)正確設(shè)計技術(shù)的想法。這些想法是在可以使設(shè)計師團 體從分享經(jīng)驗和教訓中獲益的設(shè)計模式中形成的。設(shè)計模式在80年代后期從建筑業(yè)進入計算機系統(tǒng)領(lǐng)域。面向?qū)ο?#xff08;Object-oriented,OO)原 則逐漸得到普及,而設(shè)計模式成為培育新的OO追隨者的最佳實踐。
Richard Gamma等(人們通常把他們稱作 Gang of Four [GoF] )編著的《Design Patterns: Elements of Reusable Object-Oriented Software》一書使設(shè)計模式成為萬眾矚目的焦點。隨著設(shè)計模式逐漸普及,他們所涉及的領(lǐng)域就像“Ben and Jerry”效應(yīng)那樣也逐漸廣泛起來。對那些不熟悉著名冰淇淋品牌的人來說,Ben and Jerry是一家冰淇淋產(chǎn)品的供應(yīng)商,其冰淇淋產(chǎn)品擁有各種可以想象得到的配料組合(還包括一些您永遠想象不到的)。因此,它就是設(shè)計模式,和普通的OO 設(shè)計模式一樣來源于GoF的著作,但是現(xiàn)在包括了專為開發(fā)語言、應(yīng)用服務(wù)器、行業(yè)合成等提供的設(shè)計模式。
設(shè)計模式分類
設(shè)計模式通常根據(jù)一些公共特性而組合在一起。GoF的著作把設(shè)計模式劃分為三類:Creational、Behavioral和Structural。用于J2EE的設(shè)計模式通常劃分為表現(xiàn)層(Presentation Tier)、業(yè)務(wù)邏輯層(Business Logic Tier)和集成層(Integration Tier)。這種分組方式可以使描述所有設(shè)計模式共享的公共細節(jié)更加輕松,或者使設(shè)計模式的分類和發(fā)現(xiàn)更加輕松。
在對設(shè)計模式實際應(yīng)用的討論中,需要把設(shè)計模式劃分為兩類:broad exposure和isolated use。這種劃分基于設(shè)計模式對應(yīng)用程序設(shè)計人員和開發(fā)人員的可見性和應(yīng)用程序的多個部分對設(shè)計模式的相依性。
Broad exposure 設(shè)計模式因為可以影響多個團隊成員或者應(yīng)用程序的多個方面的設(shè)計和開發(fā)而聞名。這類設(shè)計模式的品質(zhì)包括:
Isolated use是指設(shè)計模式的使用是隱藏細節(jié)的設(shè)計模式。這類設(shè)計模式的品質(zhì)包括:
將設(shè)計模式劃分為幾類為了解設(shè)計模式的范圍提供了一種快速的方法。了解范圍使評估設(shè)計模式的影響更加輕松??梢允褂没蛘邟仐夁@種設(shè)計模式嗎?一旦采用 這種設(shè)計模式就會影響應(yīng)用程序的設(shè)計嗎?這種設(shè)計模式影響了應(yīng)用程序的多個部分和其他的應(yīng)用程序了嗎?預先了解這些影響為采用設(shè)計模式提供了指導。
設(shè)計模式應(yīng)用AntiPatterns
隨著設(shè)計模式逐漸普及,出現(xiàn)了另一種叫做AntiPatterns的模式類型。盡管設(shè)計模式提供了關(guān)于可重復的最佳方法的專業(yè)知識,但是AntiPatterns通常描述應(yīng)當避免的重復行為。AntiPatterns 驗證了這樣的事實:做錯事情和辦對事情的人一樣多。
本節(jié)將探討設(shè)計模式采用中的AntiPatterns。了解這些AntiPatterns可以幫助您避免設(shè)計模式采用中的缺陷。如同設(shè)計模式一樣,在 他們提供了一些遠見或者他們是一些非常熟悉的環(huán)境時,在他們可以為您的經(jīng)驗添加色彩和使您不再感到孤獨時,此處的AntiPatterns是一個全新的概 念。如果您想有關(guān)AntiPatterns的資料,請參見本文結(jié)尾處的資源列表。
AntiPattern清單
設(shè)計模式?是的,我們?nèi)繐碛?/strong>
問題:決定在項目中使用哪一種設(shè)計模式。
應(yīng)用: 既有broad exposure又有isolated use設(shè)計模式。
環(huán)境:一位開發(fā)人員通過介紹希望在一項工程中使用設(shè)計模式。
動力:AntiPattern的動力通常有兩種來源。一種是開發(fā)人員通過包括設(shè)計模式的最佳實踐來改進項目的渴望。另一種是開發(fā)人員天生的好奇心驅(qū)使他利用這個項目來研究設(shè)計模式。
推薦的解決方案:項目中應(yīng)用了所有知名的設(shè)計模式。設(shè)計模式手冊生成一份清單,而目標是可以核對所有的設(shè)計模式。
產(chǎn)生的語境:項目團隊和交付的應(yīng)用程序由于不自然地引入太多設(shè)計模式而遭受損失。這就導致設(shè)計和開發(fā)非常復雜。這種不必要的復雜性會從已經(jīng)完成的工作量、開發(fā)團隊了解發(fā)生事情的能力、應(yīng)用程序的實際性能和功能的正確性等方面影響開發(fā)成果。
設(shè)計基本原理:設(shè)計模式是專業(yè)知識的主要來源。盡管使用他們的效果很好,但是全部使用他們就未必也是好的。
實際解決方案:設(shè)計模式的描述包含了使用模式的目標語境。必須考慮如何確保設(shè)計模式匹配項目。第二,設(shè)計模式不是來源于當某人閱讀了一本設(shè)計模式的著作后,問:“我可以把這個設(shè)計模式使用在什么地方?”而是來源于某人尋找已發(fā)現(xiàn)問題的解決方案。
Developer/Project AntiPattern的實現(xiàn)
(也稱為:Design pattern xyz? Yeah,我們有10個)
問題:在項目中或者項目之間控制設(shè)計模式的實現(xiàn)。
應(yīng)用:broad exposure和isolated use設(shè)計模式都從解決這種環(huán)境中受益。但是,broad exposure設(shè)計模式無疑控制了實現(xiàn)。
語境:開發(fā)團隊將設(shè)計模式結(jié)合到項目中。團隊由許多經(jīng)驗豐富的開發(fā)人員組成,他們知道應(yīng)該什么時候使用設(shè)計模式。所以會正確的設(shè)計模式。如果涉及到多個項目,項目之間沒有設(shè)計模式實現(xiàn)共享。
動力:最終期限日益臨近,團隊成員工作效率很高。重新使用實現(xiàn)會影響團隊效率。假設(shè)他們都是專家,他們的實現(xiàn)都非常優(yōu)秀。在多項目情況中,跨團隊通信和代碼共享要么沒有被考慮,要么被作為進度表中的潛在影響被排除。
推薦的解決方案:團隊可以根據(jù)需要單獨包含和實現(xiàn)設(shè)計模式。
產(chǎn)生的語境:即使使用了正確的設(shè)計模式,但是他們是以很多不同的方式實現(xiàn)的。在限制集成和重新使用成果的實現(xiàn)之間存在不兼容。很多不必要的時間和工作被花費在維護、調(diào)試和擴展各種實現(xiàn)上。最終,各種實現(xiàn)都將被統(tǒng)一。
設(shè)計基本原理:應(yīng)當允許專家成員獨立工作。只要所包含的設(shè)計模式足夠好,就不需要共享實現(xiàn)。
實際解決方案:開發(fā)團隊應(yīng)當協(xié)調(diào)設(shè)計模式的使用。共享設(shè)計模式的公共實現(xiàn)可在將來降低成本,但是更重要的是,它使開發(fā)人員之間互相兼容。如果需要,這種共享可以被限制到劃歸先前討論的broad exposure設(shè)計模式內(nèi)。重用實現(xiàn)在項目間也極有價值,尤其在未來將要集成的時候。
設(shè)計模式采用中IDE的角色
IDE在繼續(xù)發(fā)展和提供更多的功能。最初的IDE組成了一種編輯環(huán)境和一些調(diào)試工具?,F(xiàn)在,他們通常包含設(shè)計環(huán)境、審計工具、配置管理系統(tǒng)集成等等。 隨著IDE不斷擴展范圍,需要確認他們在設(shè)計模式實現(xiàn)中的角色。誠然,設(shè)計模式在開發(fā)語言中實現(xiàn),而IDE可以用于編輯源代碼。但是,IDE可以扮演其他 的角色嗎?
一些IDE具有下拉菜單,使您能夠選擇應(yīng)用程序中包括的設(shè)計模式。雖然這可以加快設(shè)計模式的使用,但是它只會導致更快地編寫出極差的代碼。評估這個特性需要記住幾個因素。
第一,設(shè)計模式在抽象中描述問題,并需要一些譯碼來達到正確的實現(xiàn)。但是,他們常常包含“示例實現(xiàn)(sample implementation)”,并且IDE正是將這種示例類結(jié)構(gòu)插入到應(yīng)用程序中。這很可能不是所需要的實現(xiàn),并且把他們放到應(yīng)用程序中將帶來更多的 困惑,以及需要更多的編輯和重構(gòu)工作而不是思考最初的實現(xiàn)。
第二,和IDE拖放設(shè)計模式方法有關(guān)的另一個問題是前面討論的兩種AntiPatterns。加快設(shè)計模式的實現(xiàn)很可能會產(chǎn)生大量的設(shè)計模式應(yīng)用,以及同一設(shè)計模式的多種版本,而不是解決任意問題的版本。
設(shè)計模式面臨的挑戰(zhàn)不僅僅是得到一次快速實現(xiàn),而是確定使用了正確的實現(xiàn),以及機構(gòu)中已有的一個完美的實現(xiàn)。
BEA WebLogic Workshop 8.1和設(shè)計模式
您可能是一位BEA的客戶,如果您正在閱讀本文,您可能想知道新的BEA WebLogic Workshop 8.1是如何影響您的設(shè)計模式考慮的。首先,WebLogic Workshop是IDE,因此前面有關(guān)IDE的章節(jié)同樣適用。對這些討論感興趣的Workshop的兩個額外方面是控件和預實現(xiàn)的設(shè)計模式。
WebLogic Workshop Controls是打包功能的一種方法,可以輕松將其包含到使用Workshop IDE的應(yīng)用程序中。打包包括IDE必需的可視元素、運行時行為、要求的配置等等??丶侨绾斡绊懺O(shè)計模式應(yīng)用的呢?還記得設(shè)計模式在前面劃分為 isolated use和broad exposure嗎?劃分到isolated use類的設(shè)計模式可能被打包成 Workshop Controls。把設(shè)計模式作為控件打包可使 Workshop IDE的其他用戶共享實現(xiàn),從而避免了每一個Developer/Project AntiPattern中的實現(xiàn)。
您可能想知道為什么broad exposure設(shè)計模式為什么不可以作為控件實現(xiàn)。原因是broad exposure設(shè)計模式導致創(chuàng)建了許多其他類或者獨立于其他應(yīng)用程序。這種情況就不適合控件的即插即用方面。broad exposure設(shè)計模式的采用應(yīng)當三思而后行,一旦采用就不能輕易取消。這些要求不符合WebLogic Workshop Control的目標。
WebLogic Workshop還具有很多預實現(xiàn)設(shè)計模式,如Pageflow和用戶接口結(jié)構(gòu)。在Workshop 中,您可以創(chuàng)建JSP和定義Pageflow來控制Web應(yīng)用程序頁面之間的定位。在這種情況下,WebLogic Workshop使用流行的Apache Struts 表現(xiàn)層框架。Workshop的這個方面(使用 Struts)提供了一種Model-View-Controller(MVC)設(shè)計模式實現(xiàn),意味著不用創(chuàng)建自己的MVC實現(xiàn)。Workshop包含的 其他功能很可能替代您自己的設(shè)計模式實現(xiàn)。盡管一些設(shè)計模式實現(xiàn)的開盒即用很好,但是應(yīng)當驗證不僅實現(xiàn)而且實現(xiàn)創(chuàng)建的WebLogic任何依從性也非常合 適。
成功采用設(shè)計模式的三個步驟
如何把設(shè)計模式的采用和日益臨近的最后期限、緊縮的預算和很多公司現(xiàn)有的有限團隊資源相結(jié)合?以下是成功制訂設(shè)計模式的三個步驟。
強大的通信和培訓
許多機構(gòu)擁有領(lǐng)先技術(shù),可能正式通過了設(shè)計師論壇的論證或者非正式的公認專家。這些領(lǐng)先廠商將推廣設(shè)計模式采用中的開放通信,并將培訓開發(fā)具體設(shè)計模 式的團隊。通信應(yīng)當跨開發(fā)團隊和項目以便預先防止采用豎井和多種惟一的實現(xiàn)(謹記每個Developer/Project AntiPattern的實現(xiàn))。培訓可以采用正式的internal lunch-and-learns、正式的internal class或者派一些員工參加外部培訓。這些培訓方式將促進正確的設(shè)計模式應(yīng)用程序。如果僅有極少的觀眾能夠參加培訓,最佳的候選人是那些感覺適合在回來 后能夠培訓其同事的人。
設(shè)計模式采用指導
設(shè)計模式可用于使項目受益,但是他們也可能因為誤用而對應(yīng)用程序造成損害。應(yīng)當鼓勵采用他們,但是對其的采用應(yīng)當受到審閱和驗證。設(shè)計模式可以包含在 設(shè)計和開發(fā)過程中。在任何一種情況中,設(shè)計模式的使用應(yīng)當由審閱者確認和驗證。在審閱過程中還可能會遇到這樣的情況,額外的設(shè)計模式不適用于最初包括的地 方。即使環(huán)境中沒有進行正式的審閱,這一步驟也可以通過同事審閱或者團隊討論來完成。這一步驟中的審閱者要么是主要團隊的成員,要么與他們建立開放通信。
指導采用對于broad exposure類別的設(shè)計模式非常關(guān)鍵。這些設(shè)計模式具有很多相關(guān)的風險,因為他們將創(chuàng)建依賴性。這些依賴性可能在一些對象類中,例如,只工作在更加廣 泛的DAO設(shè)計模式實現(xiàn)范圍中的數(shù)據(jù)訪問對象(DAO)、或者跨應(yīng)用程序邊界(如使用Value Object設(shè)計模式在應(yīng)用程序和應(yīng)用程序?qū)又g傳輸數(shù)據(jù))。這些設(shè)計模式也可以由項目中的其他人或者不同項目的人實現(xiàn),而且實現(xiàn)應(yīng)當重新使用,不同于創(chuàng) 建另一種獨特的實現(xiàn)。
重用實現(xiàn),不只是設(shè)計模式
只要在創(chuàng)建自己的設(shè)計模式實現(xiàn)中有一定的滿足,團隊和公司就可以在重用發(fā)生在代碼層時,而不是設(shè)計創(chuàng)意層時獲得更多益處。使企業(yè)獲益的最初設(shè)計模式是 改進的實現(xiàn)。但是,真正的目標是重用實現(xiàn)。重用實現(xiàn)將導致:a)其他可重用的類(取決于公共實現(xiàn));b)縮短開發(fā)時間和降低成本;c)縮短維護時間和降低 成本;d)在應(yīng)用程序之間和內(nèi)部輕松集成。
這種重用對broad exposure設(shè)計模式非常重要(有時是基本的)。這些設(shè)計模式創(chuàng)建了外部依賴性(集成將從公共實現(xiàn)中受益)或者產(chǎn)生全部的自定義類庫(如果有公共基礎(chǔ)將可重用)。isolated use設(shè)計模式也可以從重用中獲益,但是如果他們是根據(jù)具體情況定制的,他們就非常難以重用。
有時您可能會問自己:“如果重用比較好,為什么設(shè)計模式和可以重用的實現(xiàn)不可以一同應(yīng)用呢?”在我們討論設(shè)計模式如何使更多讀者獲益的時候才會討論這 個問題。如果可能,如果已經(jīng)預定義了實現(xiàn),那么達到廣泛適用性這個目標就會非常困難。然而,一旦設(shè)計模式被應(yīng)用到特殊的問題域或者技術(shù)基礎(chǔ)設(shè)施中,那么就 可以重用在該環(huán)境中產(chǎn)生的實現(xiàn)。
架構(gòu)中的設(shè)計模式
這看起來像是一件可怕的任務(wù),需要掌握設(shè)計模式如何應(yīng)用在實際情況中,如何構(gòu)建優(yōu)質(zhì)的實現(xiàn),以及如何促進重用實現(xiàn)。完成該任務(wù)的方法之一就是在環(huán)境中 引入應(yīng)用程序架構(gòu)。應(yīng)用程序架構(gòu)提供了應(yīng)用程序需要的結(jié)構(gòu),從而使開發(fā)團隊可以關(guān)注應(yīng)用程序的域邏輯。這包含了已實現(xiàn)的設(shè)計模式。除了重用設(shè)計模式概念或 者單個實現(xiàn)之外,可以在多個項目和應(yīng)用程序之間重用架構(gòu)。這種共享的公共實現(xiàn)確保了兼容性,并為開發(fā)和維護多種不同的實現(xiàn)提供了一種低成本替代方案。兼容 性提供了重新使用需要的技術(shù)基礎(chǔ)。沒有足夠的篇幅在這里深入討論架構(gòu)的其他重要品質(zhì),如運行時監(jiān)測和管理、可配置應(yīng)用程序邏輯和適應(yīng)性行為等。您可以從 Carnegie Mellon Software Engineering Institute ([url]www.sei.cmu.edu/ata/ata_init.html[/url]) 中學習到更多有關(guān)架構(gòu)的知識。
結(jié)束語
設(shè)計模式是一種令人驚異的資源,應(yīng)該使用他以增加您的優(yōu)勢。雖然設(shè)計模式提供了可重用的概念,但是面臨的挑戰(zhàn)是決定使用哪一種設(shè)計模式和致力于可以重用的實現(xiàn)。通過了解采用設(shè)計模式中會產(chǎn)生的風險,就可以在繼續(xù)學習和實現(xiàn)更多設(shè)計模式時避免風險。
按照本文概述的步驟會產(chǎn)生一個流程,用于在團隊和機構(gòu)中推廣成功的設(shè)計模式采用。
參考資料
設(shè)計模式無處不在。在閱讀技術(shù)方面的出版物或者瀏覽技術(shù)方面的網(wǎng)站時,很容易發(fā)現(xiàn)對設(shè)計模式的引用。到目前為止,您很可能已經(jīng)閱讀過(至少翻閱過)一 些設(shè)計模式方面的書籍,如《Core J2EE Design Patterns》或者Gang of Four編寫的《Design Patterns》。此時,您可能會對設(shè)計模式有一些疑問。設(shè)計模式如何幫助我?他們是銀彈嗎?使用設(shè)計模式有什么問題嗎?為什么我不能從集成開發(fā)環(huán)境 (integrated development environment,IDE)中獲得設(shè)計模式?
上述的幾個問題是采用設(shè)計模式進行處理過程中遇到的一些經(jīng)典問題。通常,概念和這些概念在顯示世界中的應(yīng)用是有區(qū)別的,設(shè)計模式也不例外。本文將討論設(shè)計模式在現(xiàn)實世界中的應(yīng)用。這些信息可以幫助您成功地在項目中采用設(shè)計模式來作出正確的決定。
快速概述
設(shè)計模式提供了一種共享經(jīng)驗的方式,可以使團體受益和避免不斷的重復發(fā)明。設(shè)計模式通常捕捉問題的描述、問題的語境、推薦的問題解決方案以及使用解決 方案后可以預見到的結(jié)果。為了具有最廣泛的適用性(從而對更多的讀者有用),設(shè)計模式通常從取決于環(huán)境的精確細節(jié)中抽象而來。這種抽象性產(chǎn)生了一些把設(shè)計 模式應(yīng)用到現(xiàn)有的案例中所必需的譯碼。這是一個重要細節(jié):盡管設(shè)計模式是共享專業(yè)知識的好方法,但通常它對正確應(yīng)用專業(yè)知識是非常重要的。
設(shè)計模式這個概念最初產(chǎn)生于建筑行業(yè)。設(shè)計師(設(shè)計建筑物而不是計算機系統(tǒng))意識到他們需要共享有關(guān)正確設(shè)計技術(shù)的想法。這些想法是在可以使設(shè)計師團 體從分享經(jīng)驗和教訓中獲益的設(shè)計模式中形成的。設(shè)計模式在80年代后期從建筑業(yè)進入計算機系統(tǒng)領(lǐng)域。面向?qū)ο?#xff08;Object-oriented,OO)原 則逐漸得到普及,而設(shè)計模式成為培育新的OO追隨者的最佳實踐。
Richard Gamma等(人們通常把他們稱作 Gang of Four [GoF] )編著的《Design Patterns: Elements of Reusable Object-Oriented Software》一書使設(shè)計模式成為萬眾矚目的焦點。隨著設(shè)計模式逐漸普及,他們所涉及的領(lǐng)域就像“Ben and Jerry”效應(yīng)那樣也逐漸廣泛起來。對那些不熟悉著名冰淇淋品牌的人來說,Ben and Jerry是一家冰淇淋產(chǎn)品的供應(yīng)商,其冰淇淋產(chǎn)品擁有各種可以想象得到的配料組合(還包括一些您永遠想象不到的)。因此,它就是設(shè)計模式,和普通的OO 設(shè)計模式一樣來源于GoF的著作,但是現(xiàn)在包括了專為開發(fā)語言、應(yīng)用服務(wù)器、行業(yè)合成等提供的設(shè)計模式。
設(shè)計模式分類
設(shè)計模式通常根據(jù)一些公共特性而組合在一起。GoF的著作把設(shè)計模式劃分為三類:Creational、Behavioral和Structural。用于J2EE的設(shè)計模式通常劃分為表現(xiàn)層(Presentation Tier)、業(yè)務(wù)邏輯層(Business Logic Tier)和集成層(Integration Tier)。這種分組方式可以使描述所有設(shè)計模式共享的公共細節(jié)更加輕松,或者使設(shè)計模式的分類和發(fā)現(xiàn)更加輕松。
在對設(shè)計模式實際應(yīng)用的討論中,需要把設(shè)計模式劃分為兩類:broad exposure和isolated use。這種劃分基于設(shè)計模式對應(yīng)用程序設(shè)計人員和開發(fā)人員的可見性和應(yīng)用程序的多個部分對設(shè)計模式的相依性。
Broad exposure 設(shè)計模式因為可以影響多個團隊成員或者應(yīng)用程序的多個方面的設(shè)計和開發(fā)而聞名。這類設(shè)計模式的品質(zhì)包括:
- 采用它會對很多根據(jù)設(shè)計模式創(chuàng)建的類產(chǎn)生負面影響。
- 應(yīng)用程序的不同部分知道設(shè)計模式的使用。
- 使用這種設(shè)計模式的決定不能輕易取消。
Isolated use是指設(shè)計模式的使用是隱藏細節(jié)的設(shè)計模式。這類設(shè)計模式的品質(zhì)包括:
- 設(shè)計模式不影響其他團隊成員或者應(yīng)用程序其他部分的工作。
- 可以輕松地更改使用設(shè)計模式的決定,而且產(chǎn)生的影響極小。
將設(shè)計模式劃分為幾類為了解設(shè)計模式的范圍提供了一種快速的方法。了解范圍使評估設(shè)計模式的影響更加輕松??梢允褂没蛘邟仐夁@種設(shè)計模式嗎?一旦采用 這種設(shè)計模式就會影響應(yīng)用程序的設(shè)計嗎?這種設(shè)計模式影響了應(yīng)用程序的多個部分和其他的應(yīng)用程序了嗎?預先了解這些影響為采用設(shè)計模式提供了指導。
設(shè)計模式應(yīng)用AntiPatterns
隨著設(shè)計模式逐漸普及,出現(xiàn)了另一種叫做AntiPatterns的模式類型。盡管設(shè)計模式提供了關(guān)于可重復的最佳方法的專業(yè)知識,但是AntiPatterns通常描述應(yīng)當避免的重復行為。AntiPatterns 驗證了這樣的事實:做錯事情和辦對事情的人一樣多。
本節(jié)將探討設(shè)計模式采用中的AntiPatterns。了解這些AntiPatterns可以幫助您避免設(shè)計模式采用中的缺陷。如同設(shè)計模式一樣,在 他們提供了一些遠見或者他們是一些非常熟悉的環(huán)境時,在他們可以為您的經(jīng)驗添加色彩和使您不再感到孤獨時,此處的AntiPatterns是一個全新的概 念。如果您想有關(guān)AntiPatterns的資料,請參見本文結(jié)尾處的資源列表。
AntiPattern清單
設(shè)計模式?是的,我們?nèi)繐碛?/strong>
問題:決定在項目中使用哪一種設(shè)計模式。
應(yīng)用: 既有broad exposure又有isolated use設(shè)計模式。
環(huán)境:一位開發(fā)人員通過介紹希望在一項工程中使用設(shè)計模式。
動力:AntiPattern的動力通常有兩種來源。一種是開發(fā)人員通過包括設(shè)計模式的最佳實踐來改進項目的渴望。另一種是開發(fā)人員天生的好奇心驅(qū)使他利用這個項目來研究設(shè)計模式。
推薦的解決方案:項目中應(yīng)用了所有知名的設(shè)計模式。設(shè)計模式手冊生成一份清單,而目標是可以核對所有的設(shè)計模式。
產(chǎn)生的語境:項目團隊和交付的應(yīng)用程序由于不自然地引入太多設(shè)計模式而遭受損失。這就導致設(shè)計和開發(fā)非常復雜。這種不必要的復雜性會從已經(jīng)完成的工作量、開發(fā)團隊了解發(fā)生事情的能力、應(yīng)用程序的實際性能和功能的正確性等方面影響開發(fā)成果。
設(shè)計基本原理:設(shè)計模式是專業(yè)知識的主要來源。盡管使用他們的效果很好,但是全部使用他們就未必也是好的。
實際解決方案:設(shè)計模式的描述包含了使用模式的目標語境。必須考慮如何確保設(shè)計模式匹配項目。第二,設(shè)計模式不是來源于當某人閱讀了一本設(shè)計模式的著作后,問:“我可以把這個設(shè)計模式使用在什么地方?”而是來源于某人尋找已發(fā)現(xiàn)問題的解決方案。
Developer/Project AntiPattern的實現(xiàn)
(也稱為:Design pattern xyz? Yeah,我們有10個)
問題:在項目中或者項目之間控制設(shè)計模式的實現(xiàn)。
應(yīng)用:broad exposure和isolated use設(shè)計模式都從解決這種環(huán)境中受益。但是,broad exposure設(shè)計模式無疑控制了實現(xiàn)。
語境:開發(fā)團隊將設(shè)計模式結(jié)合到項目中。團隊由許多經(jīng)驗豐富的開發(fā)人員組成,他們知道應(yīng)該什么時候使用設(shè)計模式。所以會正確的設(shè)計模式。如果涉及到多個項目,項目之間沒有設(shè)計模式實現(xiàn)共享。
動力:最終期限日益臨近,團隊成員工作效率很高。重新使用實現(xiàn)會影響團隊效率。假設(shè)他們都是專家,他們的實現(xiàn)都非常優(yōu)秀。在多項目情況中,跨團隊通信和代碼共享要么沒有被考慮,要么被作為進度表中的潛在影響被排除。
推薦的解決方案:團隊可以根據(jù)需要單獨包含和實現(xiàn)設(shè)計模式。
產(chǎn)生的語境:即使使用了正確的設(shè)計模式,但是他們是以很多不同的方式實現(xiàn)的。在限制集成和重新使用成果的實現(xiàn)之間存在不兼容。很多不必要的時間和工作被花費在維護、調(diào)試和擴展各種實現(xiàn)上。最終,各種實現(xiàn)都將被統(tǒng)一。
設(shè)計基本原理:應(yīng)當允許專家成員獨立工作。只要所包含的設(shè)計模式足夠好,就不需要共享實現(xiàn)。
實際解決方案:開發(fā)團隊應(yīng)當協(xié)調(diào)設(shè)計模式的使用。共享設(shè)計模式的公共實現(xiàn)可在將來降低成本,但是更重要的是,它使開發(fā)人員之間互相兼容。如果需要,這種共享可以被限制到劃歸先前討論的broad exposure設(shè)計模式內(nèi)。重用實現(xiàn)在項目間也極有價值,尤其在未來將要集成的時候。
設(shè)計模式采用中IDE的角色
IDE在繼續(xù)發(fā)展和提供更多的功能。最初的IDE組成了一種編輯環(huán)境和一些調(diào)試工具?,F(xiàn)在,他們通常包含設(shè)計環(huán)境、審計工具、配置管理系統(tǒng)集成等等。 隨著IDE不斷擴展范圍,需要確認他們在設(shè)計模式實現(xiàn)中的角色。誠然,設(shè)計模式在開發(fā)語言中實現(xiàn),而IDE可以用于編輯源代碼。但是,IDE可以扮演其他 的角色嗎?
一些IDE具有下拉菜單,使您能夠選擇應(yīng)用程序中包括的設(shè)計模式。雖然這可以加快設(shè)計模式的使用,但是它只會導致更快地編寫出極差的代碼。評估這個特性需要記住幾個因素。
第一,設(shè)計模式在抽象中描述問題,并需要一些譯碼來達到正確的實現(xiàn)。但是,他們常常包含“示例實現(xiàn)(sample implementation)”,并且IDE正是將這種示例類結(jié)構(gòu)插入到應(yīng)用程序中。這很可能不是所需要的實現(xiàn),并且把他們放到應(yīng)用程序中將帶來更多的 困惑,以及需要更多的編輯和重構(gòu)工作而不是思考最初的實現(xiàn)。
第二,和IDE拖放設(shè)計模式方法有關(guān)的另一個問題是前面討論的兩種AntiPatterns。加快設(shè)計模式的實現(xiàn)很可能會產(chǎn)生大量的設(shè)計模式應(yīng)用,以及同一設(shè)計模式的多種版本,而不是解決任意問題的版本。
設(shè)計模式面臨的挑戰(zhàn)不僅僅是得到一次快速實現(xiàn),而是確定使用了正確的實現(xiàn),以及機構(gòu)中已有的一個完美的實現(xiàn)。
BEA WebLogic Workshop 8.1和設(shè)計模式
您可能是一位BEA的客戶,如果您正在閱讀本文,您可能想知道新的BEA WebLogic Workshop 8.1是如何影響您的設(shè)計模式考慮的。首先,WebLogic Workshop是IDE,因此前面有關(guān)IDE的章節(jié)同樣適用。對這些討論感興趣的Workshop的兩個額外方面是控件和預實現(xiàn)的設(shè)計模式。
WebLogic Workshop Controls是打包功能的一種方法,可以輕松將其包含到使用Workshop IDE的應(yīng)用程序中。打包包括IDE必需的可視元素、運行時行為、要求的配置等等??丶侨绾斡绊懺O(shè)計模式應(yīng)用的呢?還記得設(shè)計模式在前面劃分為 isolated use和broad exposure嗎?劃分到isolated use類的設(shè)計模式可能被打包成 Workshop Controls。把設(shè)計模式作為控件打包可使 Workshop IDE的其他用戶共享實現(xiàn),從而避免了每一個Developer/Project AntiPattern中的實現(xiàn)。
您可能想知道為什么broad exposure設(shè)計模式為什么不可以作為控件實現(xiàn)。原因是broad exposure設(shè)計模式導致創(chuàng)建了許多其他類或者獨立于其他應(yīng)用程序。這種情況就不適合控件的即插即用方面。broad exposure設(shè)計模式的采用應(yīng)當三思而后行,一旦采用就不能輕易取消。這些要求不符合WebLogic Workshop Control的目標。
WebLogic Workshop還具有很多預實現(xiàn)設(shè)計模式,如Pageflow和用戶接口結(jié)構(gòu)。在Workshop 中,您可以創(chuàng)建JSP和定義Pageflow來控制Web應(yīng)用程序頁面之間的定位。在這種情況下,WebLogic Workshop使用流行的Apache Struts 表現(xiàn)層框架。Workshop的這個方面(使用 Struts)提供了一種Model-View-Controller(MVC)設(shè)計模式實現(xiàn),意味著不用創(chuàng)建自己的MVC實現(xiàn)。Workshop包含的 其他功能很可能替代您自己的設(shè)計模式實現(xiàn)。盡管一些設(shè)計模式實現(xiàn)的開盒即用很好,但是應(yīng)當驗證不僅實現(xiàn)而且實現(xiàn)創(chuàng)建的WebLogic任何依從性也非常合 適。
成功采用設(shè)計模式的三個步驟
如何把設(shè)計模式的采用和日益臨近的最后期限、緊縮的預算和很多公司現(xiàn)有的有限團隊資源相結(jié)合?以下是成功制訂設(shè)計模式的三個步驟。
強大的通信和培訓
許多機構(gòu)擁有領(lǐng)先技術(shù),可能正式通過了設(shè)計師論壇的論證或者非正式的公認專家。這些領(lǐng)先廠商將推廣設(shè)計模式采用中的開放通信,并將培訓開發(fā)具體設(shè)計模 式的團隊。通信應(yīng)當跨開發(fā)團隊和項目以便預先防止采用豎井和多種惟一的實現(xiàn)(謹記每個Developer/Project AntiPattern的實現(xiàn))。培訓可以采用正式的internal lunch-and-learns、正式的internal class或者派一些員工參加外部培訓。這些培訓方式將促進正確的設(shè)計模式應(yīng)用程序。如果僅有極少的觀眾能夠參加培訓,最佳的候選人是那些感覺適合在回來 后能夠培訓其同事的人。
設(shè)計模式采用指導
設(shè)計模式可用于使項目受益,但是他們也可能因為誤用而對應(yīng)用程序造成損害。應(yīng)當鼓勵采用他們,但是對其的采用應(yīng)當受到審閱和驗證。設(shè)計模式可以包含在 設(shè)計和開發(fā)過程中。在任何一種情況中,設(shè)計模式的使用應(yīng)當由審閱者確認和驗證。在審閱過程中還可能會遇到這樣的情況,額外的設(shè)計模式不適用于最初包括的地 方。即使環(huán)境中沒有進行正式的審閱,這一步驟也可以通過同事審閱或者團隊討論來完成。這一步驟中的審閱者要么是主要團隊的成員,要么與他們建立開放通信。
指導采用對于broad exposure類別的設(shè)計模式非常關(guān)鍵。這些設(shè)計模式具有很多相關(guān)的風險,因為他們將創(chuàng)建依賴性。這些依賴性可能在一些對象類中,例如,只工作在更加廣 泛的DAO設(shè)計模式實現(xiàn)范圍中的數(shù)據(jù)訪問對象(DAO)、或者跨應(yīng)用程序邊界(如使用Value Object設(shè)計模式在應(yīng)用程序和應(yīng)用程序?qū)又g傳輸數(shù)據(jù))。這些設(shè)計模式也可以由項目中的其他人或者不同項目的人實現(xiàn),而且實現(xiàn)應(yīng)當重新使用,不同于創(chuàng) 建另一種獨特的實現(xiàn)。
重用實現(xiàn),不只是設(shè)計模式
只要在創(chuàng)建自己的設(shè)計模式實現(xiàn)中有一定的滿足,團隊和公司就可以在重用發(fā)生在代碼層時,而不是設(shè)計創(chuàng)意層時獲得更多益處。使企業(yè)獲益的最初設(shè)計模式是 改進的實現(xiàn)。但是,真正的目標是重用實現(xiàn)。重用實現(xiàn)將導致:a)其他可重用的類(取決于公共實現(xiàn));b)縮短開發(fā)時間和降低成本;c)縮短維護時間和降低 成本;d)在應(yīng)用程序之間和內(nèi)部輕松集成。
這種重用對broad exposure設(shè)計模式非常重要(有時是基本的)。這些設(shè)計模式創(chuàng)建了外部依賴性(集成將從公共實現(xiàn)中受益)或者產(chǎn)生全部的自定義類庫(如果有公共基礎(chǔ)將可重用)。isolated use設(shè)計模式也可以從重用中獲益,但是如果他們是根據(jù)具體情況定制的,他們就非常難以重用。
有時您可能會問自己:“如果重用比較好,為什么設(shè)計模式和可以重用的實現(xiàn)不可以一同應(yīng)用呢?”在我們討論設(shè)計模式如何使更多讀者獲益的時候才會討論這 個問題。如果可能,如果已經(jīng)預定義了實現(xiàn),那么達到廣泛適用性這個目標就會非常困難。然而,一旦設(shè)計模式被應(yīng)用到特殊的問題域或者技術(shù)基礎(chǔ)設(shè)施中,那么就 可以重用在該環(huán)境中產(chǎn)生的實現(xiàn)。
架構(gòu)中的設(shè)計模式
這看起來像是一件可怕的任務(wù),需要掌握設(shè)計模式如何應(yīng)用在實際情況中,如何構(gòu)建優(yōu)質(zhì)的實現(xiàn),以及如何促進重用實現(xiàn)。完成該任務(wù)的方法之一就是在環(huán)境中 引入應(yīng)用程序架構(gòu)。應(yīng)用程序架構(gòu)提供了應(yīng)用程序需要的結(jié)構(gòu),從而使開發(fā)團隊可以關(guān)注應(yīng)用程序的域邏輯。這包含了已實現(xiàn)的設(shè)計模式。除了重用設(shè)計模式概念或 者單個實現(xiàn)之外,可以在多個項目和應(yīng)用程序之間重用架構(gòu)。這種共享的公共實現(xiàn)確保了兼容性,并為開發(fā)和維護多種不同的實現(xiàn)提供了一種低成本替代方案。兼容 性提供了重新使用需要的技術(shù)基礎(chǔ)。沒有足夠的篇幅在這里深入討論架構(gòu)的其他重要品質(zhì),如運行時監(jiān)測和管理、可配置應(yīng)用程序邏輯和適應(yīng)性行為等。您可以從 Carnegie Mellon Software Engineering Institute ([url]www.sei.cmu.edu/ata/ata_init.html[/url]) 中學習到更多有關(guān)架構(gòu)的知識。
結(jié)束語
設(shè)計模式是一種令人驚異的資源,應(yīng)該使用他以增加您的優(yōu)勢。雖然設(shè)計模式提供了可重用的概念,但是面臨的挑戰(zhàn)是決定使用哪一種設(shè)計模式和致力于可以重用的實現(xiàn)。通過了解采用設(shè)計模式中會產(chǎn)生的風險,就可以在繼續(xù)學習和實現(xiàn)更多設(shè)計模式時避免風險。
按照本文概述的步驟會產(chǎn)生一個流程,用于在團隊和機構(gòu)中推廣成功的設(shè)計模式采用。
參考資料
- Brown、William J.;Malveau、Raphael C.;McCormick、Hays W. "Skip";Mowbray、Thomas J. (1998)?!禔ntiPatterns: Refactoring Software, Architectures, and Projects in Crisis》,John Wiley & Sons
- AntiPatterns:[url]www.antipatterns.com[/url]
- Wiki站點:[url]http://c2.com/cgi/wiki?AntiPattern[/url]
0
微博 QQ 微信收藏
上一篇:面向?qū)ο笤O(shè)計模式與原則 下一篇:Macromedia Flex ... weijie@java56篇文章,78W+人氣,1粉絲
關(guān)注轉(zhuǎn)載于:https://blog.51cto.com/weijie/75523
總結(jié)
- 上一篇: VMWare 6.0桥接模式虚拟机网络配
- 下一篇: 读《大话设计模式》有感