設(shè)計(jì)模式的精髓在于封裝變化點(diǎn),對(duì)設(shè)計(jì)模式的理解與掌握,不在于模式中各個(gè)類之間的關(guān)系理清,更不在于具體的語言,而在于模式面臨的需求場(chǎng)景。要從發(fā)現(xiàn)需求變動(dòng),準(zhǔn)確找到變化點(diǎn),從如何封裝它的角度去研究,去學(xué)習(xí),而不要拘泥于具體的形式。
下面對(duì)設(shè)計(jì)模式進(jìn)行一個(gè)整體的小結(jié):
GOF設(shè)計(jì)模式劃分為創(chuàng)建型、結(jié)構(gòu)型和行為型。
創(chuàng)建型模式是創(chuàng)建對(duì)象而不是直接實(shí)例化對(duì)象,這會(huì)使程序在判斷給定情況下創(chuàng)建哪一個(gè)對(duì)象時(shí)更為靈活。
結(jié)構(gòu)型模式可以將一組對(duì)象組合成更大的結(jié)構(gòu),例如復(fù)雜的用戶界面或報(bào)表數(shù)據(jù)。
行為型模式定義系統(tǒng)內(nèi)對(duì)像間的通信,以及復(fù)雜程序中的流程控制。
創(chuàng)建型:
抽象工廠:創(chuàng)建一系列“相關(guān)或者相互依賴的對(duì)象”。
使用場(chǎng)景:
系統(tǒng)中有多個(gè)產(chǎn)品族。
客戶不需要知道要對(duì)象的創(chuàng)建過程。
客戶使用的對(duì)象存在變動(dòng)的可能,或者根本就不知道使用哪一個(gè)具體的對(duì)象。
構(gòu)建器模式:創(chuàng)建一個(gè)復(fù)雜的對(duì)象。
使用場(chǎng)景:
當(dāng)需要?jiǎng)?chuàng)建的是一個(gè)產(chǎn)品,且該產(chǎn)品的內(nèi)部表現(xiàn)比較復(fù)雜。
客戶不需要知道產(chǎn)品的內(nèi)部細(xì)節(jié)。
單件模式:為對(duì)象生成一個(gè)唯一的實(shí)例。
使用場(chǎng)景:
系統(tǒng)只要一個(gè)實(shí)例對(duì)象。
客戶調(diào)用類的單個(gè)實(shí)例只允許使用一個(gè)公共訪問點(diǎn)。
原型模式:通過對(duì)一個(gè)已存在的對(duì)象克隆來創(chuàng)建另一個(gè)相似的對(duì)象。
使用場(chǎng)景:
類的實(shí)例化是動(dòng)態(tài)的。
類的實(shí)例對(duì)象只有一個(gè)或很少的幾個(gè)組合狀態(tài)。
結(jié)構(gòu)型:
橋接模式:將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。
使用場(chǎng)景:
避免抽象方法和其實(shí)現(xiàn)方法綁定在一起。
抽象接口和它的實(shí)現(xiàn)都需要擴(kuò)展出子類以備使用。
變動(dòng)實(shí)現(xiàn)的方法根本不會(huì)影響客戶程序調(diào)用部分。
適配器模式:類的接口轉(zhuǎn)換期望的另外一個(gè)接口,從而使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
使用場(chǎng)景:
對(duì)象需要利用現(xiàn)在的并且接口不兼容的類。
需要?jiǎng)?chuàng)建可重用的類以作其他接口不一定兼容的類。
需要使用若干個(gè)現(xiàn)在的子類但又不想派生這些子類的每一個(gè)接口。
裝飾模式:不改變對(duì)象結(jié)構(gòu)的情況下給對(duì)象添加新的職責(zé)。
使用場(chǎng)景:
給對(duì)象增加的職責(zé)在未來會(huì)發(fā)生改變。
用子類擴(kuò)展功能不實(shí)際的情況下。
外觀模式:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,其定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。
使用場(chǎng)景:
需要復(fù)雜的子系統(tǒng)提供一個(gè)簡(jiǎn)單的接口。
客戶與抽象的實(shí)現(xiàn)類中存在若干依賴。
子系統(tǒng)分層是必要的或架構(gòu)要求的情況下。
享元模式:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。
使用場(chǎng)景:
系統(tǒng)需要存在大量的對(duì)象而共享某些本質(zhì)的、不變的信息。
對(duì)象可以同時(shí)用于多個(gè)環(huán)境下。
在每個(gè)實(shí)例下,享元可以作為一個(gè)獨(dú)立的對(duì)象。
組合模式:組合多個(gè)對(duì)象形成樹形結(jié)構(gòu),以表示整體-部分的結(jié)構(gòu)層次。組合模式對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
使用場(chǎng)景:
當(dāng)需要表示一個(gè)對(duì)象的整體或部分層次。
想讓客戶忽略不同對(duì)象的層次變化。
對(duì)象的結(jié)構(gòu)是動(dòng)態(tài)的并且復(fù)雜程度不一樣,但客戶需要一致的處理它們。
代理模式:代理模式(Proxy)的目標(biāo)是為其他對(duì)象提供一個(gè)代理或地方以控制對(duì)這個(gè)對(duì)象的訪問。當(dāng)客戶向代理對(duì)象第一次提出請(qǐng)求時(shí),代理實(shí)例化真實(shí)對(duì)象,并且將請(qǐng)求傳給它,以后所有客戶請(qǐng)求都經(jīng)由代理傳給真實(shí)對(duì)象。
使用場(chǎng)景:
虛擬代理、遠(yuǎn)程代理、安全代理、聰明引用。
行為型:
模版模式:定義一個(gè)操作中算法的骨架,將一些步驟的執(zhí)行延遲到其子類中。
使用場(chǎng)景:
需要將相同的算法放在一個(gè)類中,將算法變化的部分放在子類中實(shí)現(xiàn)。
子類公共的算法應(yīng)該放在一個(gè)公共類中,避免代碼重復(fù)。
責(zé)任鏈模式:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。
使用場(chǎng)景:
超過一個(gè)對(duì)象能夠處理客戶請(qǐng)求并且到底哪個(gè)對(duì)象處理。
一個(gè)請(qǐng)求可以發(fā)布到多個(gè)對(duì)象但它的接收都是不清晰。
可以動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求。
命令模式:將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,因此可以參數(shù)化多個(gè)客戶的不同請(qǐng)求,將請(qǐng)求排除,記錄請(qǐng)求日志,并支持撤消操作。
使用場(chǎng)景:
需要與動(dòng)作有關(guān)的對(duì)象來作為參數(shù)。
需要在不同的時(shí)間創(chuàng)建請(qǐng)求,生成請(qǐng)求隊(duì)列,執(zhí)行請(qǐng)求。
需要支持取消、保存或處理事務(wù)的功能。
需要支持宏命令。
解釋器模式:給出一種語言,定義這種語言的文法的一種表示,定義一個(gè)解釋器,用它來解釋使用這種語言的句子。
使用場(chǎng)景:
語言的文法需要擴(kuò)展。
迭代器模式:提供一種方法可以訪問聚合對(duì)象,而不用暴露這個(gè)對(duì)象的內(nèi)部表示。
使用場(chǎng)景:
需要遍歷訪問聚集中的對(duì)象而不能暴露聚集的內(nèi)部結(jié)構(gòu)。
允許對(duì)聚集的多級(jí)遍歷訪問而不會(huì)相互受影響。
提供一個(gè)一致的接口來遍歷訪問聚集中不同的結(jié)構(gòu)。
中介模式:定義一個(gè)對(duì)象封裝一系列多個(gè)對(duì)象如何相互作用,使得對(duì)象間不需要顯式地相互引用,從而使其耦合更加松散,并且還讓我們可以獨(dú)立變化多個(gè)對(duì)象相互作用。
使用場(chǎng)景:
一組對(duì)象復(fù)雜地相互通信但其方法是定義明確的。
若干個(gè)對(duì)象需要定義方法又不需要子類實(shí)現(xiàn)。
觀察者模式:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí), 所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
使用場(chǎng)景:
一個(gè)對(duì)象的變化請(qǐng)求需要其他對(duì)象也變化,并且其他要變化對(duì)象的數(shù)量不明確。
一個(gè)對(duì)象需要通知其他對(duì)象而不需要掌握其他對(duì)象的識(shí)別方法。
備忘模式:在不破壞封閉的前提下,捕獲并保存一個(gè)對(duì)象的內(nèi)部狀態(tài),這樣可以將對(duì)象恢復(fù)到原先的狀態(tài)。
使用場(chǎng)景:
對(duì)象狀態(tài)的備忘足以使對(duì)象可以完全恢復(fù)到原來的狀態(tài)。
狀態(tài)模式:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變行為。
使用場(chǎng)景:
對(duì)象的行為于它的狀態(tài),并且它必須可以根據(jù)它的狀態(tài)而改變行為。
系統(tǒng)存在大量的條件判斷語句。
策略模式:定義一系列算法,將每個(gè)算法封裝起來,并讓他們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化。
使用場(chǎng)景:
多個(gè)類的分別只是在于行為不同。
需要對(duì)行為的算法作很多變動(dòng)。
客戶不知道算法要使用的數(shù)據(jù)。
訪問者模式:分離對(duì)象數(shù)據(jù)結(jié)構(gòu)與行為的方法,通過這種分離,可以為一個(gè)已存在的類或類群增加新的操作而無需為它們作任何修改。
使用場(chǎng)景:
一個(gè)對(duì)象的結(jié)構(gòu)包含多個(gè)不同接口的對(duì)象,并且需要根據(jù)具體對(duì)象作不同的處理。
對(duì)結(jié)構(gòu)中的對(duì)象有很多不同且沒有聯(lián)系的處理,因此需要避免操作將類分離。
類中定義的對(duì)象結(jié)構(gòu)很少改變,但你需要經(jīng)常地定義處理結(jié)構(gòu)的新操作。