1.1 設(shè)計(jì)模式釋義
設(shè)計(jì)模式是高層次的、抽象的解決方案模板。可以將這些模式視為解決方案的藍(lán)本而不是解決方案本身。從中無法找到一種可以簡單地運(yùn)用到應(yīng)用程序中的框架;相反,通常是通過重構(gòu)自己的代碼并將問題泛化來實(shí)現(xiàn)設(shè)計(jì)模式。
設(shè)計(jì)模式不僅適用于軟件開發(fā)領(lǐng)域,從工程到建筑的所有領(lǐng)域都能夠找到它的身影。實(shí)際上,模式的思想是由著名建筑大師Christopher Alexander在20世紀(jì)70年代引入的,目的是為設(shè)計(jì)討論構(gòu)建一張公共的詞匯表。他寫道:
本語言的元素是被稱為模式的實(shí)體。每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心,這樣就可以一次又一次地使用該方案而不必做重復(fù)勞動(dòng)。
Alexander的觀點(diǎn)不僅適用于建筑和城市規(guī)劃,也適用于軟件設(shè)計(jì)。
1.1.1 起源
當(dāng)今軟件體系結(jié)構(gòu)中比較流行的設(shè)計(jì)模式起源于程序員多年使用面向?qū)ο缶幊陶Z言而積累的經(jīng)驗(yàn)和知識。Design Patterns: Elements of Reusable Object-Oriented Software(又被親切地稱為Design Patterns Bible,即“設(shè)計(jì)模式圣經(jīng)”)一書收錄了絕大多數(shù)最常見的模式。這本書是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四人合著而成,而他們常被稱為“四人組”(GoF)。
他們收錄了23種設(shè)計(jì)模式并將它們歸納為3組。
● 創(chuàng)建型模式:處理對象構(gòu)造和引用。
● 結(jié)構(gòu)型模式:處理對象之間的關(guān)系以及它們之間如何進(jìn)行交互以形成更大的復(fù)雜對象。
● 行為型模式:處理對象之間的通信,特別是在責(zé)任和算法方面。
所有模式均采用模板表達(dá),這樣讀者就可以學(xué)習(xí)如何解讀模式并加以運(yùn)用。我們將在第2章中講解使用設(shè)計(jì)模式模板所需的實(shí)用知識,并簡要介紹將要在本書剩余部分學(xué)到的所有模式。
1.1.2 必要性
模式對于軟件設(shè)計(jì)和開發(fā)而言至關(guān)重要。不管是在設(shè)計(jì)階段解決問題,還是在源代碼中,模式都支持通過共享的詞匯表來表達(dá)思想。模式提倡使用優(yōu)秀的面向?qū)ο筌浖O(shè)計(jì),這是因?yàn)樗鼈兪菄@可靠的面向?qū)ο笤O(shè)計(jì)原則而構(gòu)建的。
模式是描述復(fù)雜問題的解決方案的有效方式。如果具備設(shè)計(jì)模式的牢固知識,就可以與團(tuán)隊(duì)中的其他成員快速、順暢地溝通,而不必糾結(jié)于底層的實(shí)現(xiàn)細(xì)節(jié)。
模式是語言不可知的,因此,可以將它們轉(zhuǎn)換成其他面向?qū)ο笳Z言。通過學(xué)習(xí)模式而獲得的知識將能夠運(yùn)用于具體編程時(shí)采用的任何優(yōu)秀的面向?qū)ο笳Z言。
1.1.3 有效性
設(shè)計(jì)模式的使用價(jià)值和終極價(jià)值在于,它們是可靠的、經(jīng)過驗(yàn)證的解決方案,它們的有效性毋庸置疑。如果是一名經(jīng)驗(yàn)豐富的開發(fā)者并且已經(jīng)采用.NET或其他面向?qū)ο缶幊陶Z言從事編程工作多年,或許發(fā)現(xiàn)自己已經(jīng)在使用“GoF”書中提及的一些設(shè)計(jì)模式。但如果能夠辨別正在使用的模式,那么與其他同樣理解模式的開發(fā)者的溝通效率就會(huì)高得多,他們會(huì)理解您的解決方案的結(jié)構(gòu)。
設(shè)計(jì)模式的宗旨就是重用解決方案。當(dāng)然,并非所有問題都是一模一樣的,但如果能夠?qū)⒁粋€(gè)問題分解,并找出它與以前解決過的問題之間的相似之處,就可以運(yùn)用這些解決方案。經(jīng)過數(shù)十年的面向?qū)ο缶幊虒?shí)踐,所遇到的大多數(shù)問題在之前已經(jīng)被解決過無數(shù)次,而且會(huì)有一種模式可用于幫助您實(shí)現(xiàn)解決方案。即使您認(rèn)為自己遇到的問題是獨(dú)特的,也應(yīng)該可以通過將其分解成若干基本要素,將其泛化至一定程度,從而找出一種合適的解決方案。
設(shè)計(jì)模式的名稱非常有用,這是因?yàn)樗从吵鲈撃J降男袨楹湍康?,并為人們在集思廣益討論解決方案時(shí)提供常用的詞匯表。使用模式名稱討論,要比詳細(xì)地討論其具體實(shí)現(xiàn)如何工作更加容易。