官术网_书友最值得收藏!

2.1 設(shè)計模式及其作用

設(shè)計模式(Design Pattern)是軟件設(shè)計中給定背景(Context)下普遍存在的問題的一般性、可復(fù)用的解決方案[1]。這個定義可能有點抽象,但是我們可以先了解一下設(shè)計模式的歷史由來以對其獲得一個感性的認(rèn)識。

一般認(rèn)為模式(Pattern)起源于Christopher Alexander所提出的建筑上的概念,后來有人開始將其用到軟件行業(yè)。這其中最為人所熟知的是Erich Gamma等4人(這4人亦被稱為Gang of Four,GOF)于1994年所出版的經(jīng)典之作《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》(Design Patterns: Elements of Reusable Object-Oriented Software)。實際上,國人也不必舍近求遠(yuǎn),我們可以從大家耳熟能詳?shù)娜嬛腥ブ苯痈惺芤幌略O(shè)計模式是什么。

中國古代兵法著作《三十六計》中提到的許多計策都是大家耳熟能詳?shù)模缯{(diào)虎離山計、離間計、反間計等。《三十六計》中的每個計策都可以看作一個關(guān)于計策的模式。例如,其中的借刀殺人計的描述如下:

敵已明,友未定,引友殺敵,不自出力,以《損》推演。

意思是說,目前的形勢是,誰是敵人已經(jīng)明朗而誰是友人尚未明確。在此情形下,利用“友人”去消滅敵人,自己則不用親自動手便能夠坐收漁人之利。這個計策是根據(jù)《易經(jīng)》中的損卦推演出來的。

借刀殺人計的描述就可以反映出設(shè)計模式的幾個要素。首先是所謂的給定背景,它指明了什么情況下可以運(yùn)用某個計策(模式)。借刀殺人計中的“敵已明,友未定”(誰是敵人已明朗,誰是友人尚未明確)就說明了該計策(模式)的運(yùn)用背景。其次是解決方案,當(dāng)然解決方案的背后是問題。對于借刀殺人計而言,要解決的問題很明顯是消滅敵人,而相應(yīng)的解決方案是借他人(即“友人”)之手而不必自己親自動手:由于敵人已明朗,而“友人”尚未明確,借“友人”之手去消滅敵人,則這兩方無論誰受打擊對己方而言都是有利而無害的。再次是隱藏在計策(模式)背后的思想,《三十六計》中的計策源自《易經(jīng)》中的卦象(思想)。例如,借刀殺人計就是根據(jù)《易經(jīng)》中的第41卦(損卦)推演出來的。

另外,計策和計策之間往往不是孤立的,而是需要相互配合使用的。例如,離間計(其核心是破壞敵人內(nèi)部關(guān)系,使他們疏遠(yuǎn))和反間計(其核心是發(fā)現(xiàn)敵方的間諜后不揭穿而利用其傳遞假情報)就經(jīng)常配合著使用。《三國演義》中“蔣干盜書”的故事就是綜合使用了離間計和反間計以削弱曹操的勢力。赤壁大戰(zhàn)前夕,曹操手下的謀士蔣干去東吳勸降周瑜,周瑜則故意在書房中讓蔣干盜得一封捏造的由曹操水軍將領(lǐng)蔡瑁、張允寫給自己的降書,以利用蔣干攜帶假情報給曹操,離間曹操與蔡瑁、張允之間的關(guān)系。曹操果真上了當(dāng),斬了精通水戰(zhàn)的蔡瑁、張允。另外,三十六計中專門有一計叫作連環(huán)計,其核心就是環(huán)環(huán)相扣地使用其他各個計策。連環(huán)計更加明確地表明了各個計策之間不是孤立的,在特定情況下它們是相互聯(lián)系的。

此時回到正題,就不難理解設(shè)計模式了:我們可以將設(shè)計模式看作軟件設(shè)計領(lǐng)域的三十六計。

正如三十六計中的各個計策之間并不是孤立的,而是相互聯(lián)系的,設(shè)計模式與設(shè)計模式之間也不是孤立的。在解決實際問題的過程中,我們往往需要綜合使用多個設(shè)計模式,而不是單靠某個設(shè)計模式,這點從本書后續(xù)所提供的各個實戰(zhàn)案例中可見一斑。

隱藏在三十六計背后的是《易經(jīng)》中的思想,而隱藏在設(shè)計模式背后的是面向?qū)ο笤O(shè)計的思想[2]

設(shè)計模式是一種可復(fù)用的設(shè)計方案,它并不是可以直接使用的代碼。因此,這就涉及設(shè)計模式的實現(xiàn)問題,即如何將設(shè)計方案轉(zhuǎn)化為可執(zhí)行的代碼。當(dāng)然,這也涉及編程語言,具體來說是面向?qū)ο蟮木幊陶Z言。因此,一方面設(shè)計模式依賴于編程語言,因為最終我們要將設(shè)計模式轉(zhuǎn)化為具體的可執(zhí)行的代碼;另一方面,設(shè)計模式具有語言獨(dú)立性,一個設(shè)計模式可以使用Java語言實現(xiàn),也可以使用C++、C#等其他面向?qū)ο蟮木幊陶Z言實現(xiàn)。當(dāng)然,在實現(xiàn)設(shè)計模式時我們也必須考慮所選用的編程語言自身的特點。由于本書選用Java語言作為實現(xiàn)語言,因此對設(shè)計模式進(jìn)行描述時有時會直接從語言的層面出發(fā)。讀者若需要以其他語言作為實現(xiàn)語言也無妨,只要在具體實現(xiàn)時充分考慮語言自身的特點即可。考慮到設(shè)計模式本身并非可直接使用的代碼,而其實現(xiàn)又離不開代碼,本書在介紹各個具體設(shè)計模式的時候會盡可能地給出相應(yīng)的可復(fù)用實現(xiàn)代碼,以便讀者理解和應(yīng)用相應(yīng)的設(shè)計模式。

設(shè)計模式可以為我們解決設(shè)計問題提供可借鑒的成熟解決方案。設(shè)計模式是在廣泛實踐的基礎(chǔ)上提煉出來的設(shè)計方案。這也就意味著,很多設(shè)計模式已經(jīng)被廣泛運(yùn)用在很多軟件的設(shè)計之中。例如,Java標(biāo)準(zhǔn)庫API的設(shè)計就運(yùn)用了很多設(shè)計模式。本書也正是鑒于此,在介紹每個具體的設(shè)計模式時,設(shè)有專門的一節(jié)介紹Java標(biāo)準(zhǔn)庫對相應(yīng)設(shè)計模式的運(yùn)用。

設(shè)計模式為軟件開發(fā)人員之間闡述和溝通設(shè)計方案提供了公用的詞匯。在團(tuán)隊開發(fā)中,軟件的設(shè)計必然涉及設(shè)計方案的討論與溝通。一方面,負(fù)責(zé)設(shè)計的人員之間需要進(jìn)行方案的溝通。另一方面,最終負(fù)責(zé)落實設(shè)計方案的人員(開發(fā)人員)也需要理解設(shè)計方案,這當(dāng)然也涉及相應(yīng)的闡述和溝通,而設(shè)計模式為開發(fā)人員之間闡述和溝通設(shè)計方案提供了一個統(tǒng)一的基礎(chǔ),即大家都能理解且理解一致的詞匯。這種詞匯在軟件設(shè)計過程中所起的作用,正如其他專業(yè)術(shù)語(如繼承、多態(tài)等)在我們工作的過程中所起的作用一樣。比如,團(tuán)隊成員在討論一個關(guān)于如何擴(kuò)展我們手頭沒有源代碼的Java類的問題時,有人提出“我們自己新建一個類,該類繼承自××類”,此時大家便都明白可以怎么做了。

設(shè)計模式可以作為描述軟件架構(gòu)的一種方式。設(shè)計模式構(gòu)建了開發(fā)人員之間闡述和溝通設(shè)計方案的詞匯,因此它自然可以用來描述軟件的架構(gòu)。有了設(shè)計模式,我們在描述系統(tǒng)架構(gòu)的時候便可以使用“本模塊運(yùn)用了××設(shè)計模式”之類的語句。

主站蜘蛛池模板: 通海县| 柳林县| 河源市| 郎溪县| 楚雄市| 奇台县| 五峰| 平原县| 南部县| 同仁县| 介休市| 长泰县| 尤溪县| 靖安县| 阳朔县| 惠东县| 江津市| 和林格尔县| 揭西县| 东山县| 固安县| 年辖:市辖区| 额尔古纳市| 桂阳县| 烟台市| 六安市| 隆尧县| 阆中市| 阿克| 襄城县| 房山区| 威海市| 南充市| 墨江| 郓城县| 汽车| 武鸣县| 丰台区| 乌审旗| 开封市| 铅山县|