调侃《Head First设计模式》之总结篇
? ? ? ? ?在之前的設(shè)計模式博客中,主要根據(jù)《Head First設(shè)計模式》談了10個設(shè)計模式,今天來做下總結(jié),好好梳理提煉x下精華,而且今天準(zhǔn)備把GOF經(jīng)典大作《設(shè)計模式》中的23個設(shè)計模式都總結(jié)一遍。(以下內(nèi)容參考了程杰的《大話設(shè)計模式》)
? ? ? 在GOF的大作中,把23個設(shè)計模式做了分類:建造型,結(jié)構(gòu)型,行為型。
? ? ?建造型的設(shè)計模式有:抽象工廠,建造者,工廠方法,原型。
? ? ?1.抽象工廠,它用于提供一個創(chuàng)建一系列或相關(guān)依賴對象的接口,而不需要明確指明類。
? ? ?
? ? ? ?圖中A、B代表不同的產(chǎn)品種類,1、2表示同種產(chǎn)品的不同分支,AbstractFactory是抽象工廠,它不關(guān)心實際生產(chǎn)出的具體產(chǎn)品,它只知道要生產(chǎn)一個包含A、B兩種產(chǎn)品的一個系列產(chǎn)品,由它的子類,具體的工廠去決定生產(chǎn)的具體產(chǎn)品。
? ? ? 2. 建造者模式:將一個復(fù)雜對象的構(gòu)建和表示分離,使得同樣的建造過程可以創(chuàng)建不同的表示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ?Build指明建造的過程,該過程會在Director被順序執(zhí)行。而在ConcreteBuilder中指明具體的表示(即實現(xiàn)了建造過程的方法),一般用于同類建造過程穩(wěn)定的、內(nèi)部表示容易改變的產(chǎn)品。該表表示只要定義一個新的ConcreteBuilder就可以了。
? ? ?3.工廠方法:定義一個創(chuàng)建對象的接口,讓子類決定實例化哪一個類。
? ? ?
? ? ?工廠方法將具體產(chǎn)品的創(chuàng)建延遲到子類,實現(xiàn)了創(chuàng)建和使用的解耦。
? ? 4.原型模式:用原型實例指定創(chuàng)建對象的種類,并且通過這些原型創(chuàng)建新的對象。
? ? ? ?
? ? ??
? ? 5.單例模式:保證一個類只有一個實例,并提供一個訪問它的全局訪問點。
? ? ? ? ?
? ? 結(jié)構(gòu)型有適配器,橋接,組合,裝飾,外觀,享元,代理。
? ? 6.適配器模式:將一個類的接口轉(zhuǎn)化為客戶希望的另一個接口,使得原來接口不兼容而不能一起工作的類可以一起工作。
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? 適配器和期望的類實現(xiàn)同一接口,同時適配器持有被需要適配的類的引用,這樣就可以完成類的接口適配器。
? ? ?7.橋接模式:使抽象部分和實現(xiàn)部分分離,使它們可以獨立的變化。
? ? ? ? ? ? ? ? ? ??
? ? ??
? ? ?8.組合模式:將對象組合成樹狀結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),組合模式使得用戶對單個對象和組合對象的使用具有一致性。
? ? ? ? ? ? ? ? ??
? ?
? ? ?葉節(jié)點和枝節(jié)點實現(xiàn)共同的接口,但是實現(xiàn)方法的方法不同,枝節(jié)點可以持有枝節(jié)點或者葉節(jié)點的引用,而葉節(jié)點不能。客戶端將葉節(jié)點和枝節(jié)點一視同仁,方便遍歷,省去了冗長的判斷語句。
? ? 9.裝飾者模式:動態(tài)給對象添加一些額外的職責(zé),比生成子類更加靈活。
? ??
? ? ?Decorator持有ConcreteComponent的引用并為其添加職責(zé),由于ConcreteComponent和Decorator實現(xiàn)同一個接口,所以被裝飾者可以再一次被裝飾。
? ? 10.外觀模式:定義了一個高層的接口,為子系統(tǒng)的一組接口提供了一個一直一致的界面,使得子系統(tǒng)更加容易使用。
? ??
? ? ? Facade類將原來各個類的一些方法封裝成一個方法,按順序調(diào)用,使得一次調(diào)用就可以完成原本需要多次調(diào)用的任務(wù)。
? ? ? 11.享元模式:運用共享技術(shù)有效的支持大粒度的對象。
? ? ?
? ? ?當(dāng)有大量類存在很多相似地方的時候可以用享元模式,可以大幅度減少實例化的類的對象,而對象間不同的部分,可以用其他對象來表示為外部狀態(tài)。
? ?12.代理模式:為其他對象提供代理以控制對這個對象的訪問。
? ??
? ? 由于被代理類和代理類都實現(xiàn)了共同接口,所以只要是使用到被代理類的地方都可以用代理來代替。
? ??
? ?行為型模式:觀察者、模板方法、命令、狀態(tài)、職責(zé)鏈、解釋器中介者、訪問者、策略、迭代器。
? ?
? ?13.觀察者模式:定義對象間一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生變化時,所以依賴它的對象收到通知并自動更新。
? ? ?
? ? ? 只要實現(xiàn)了Observer接口的對象都可以被觀察者觀察,觀察者不在意被觀察的對象類型,所以實現(xiàn)了觀察者和被觀察者的解耦。每當(dāng)觀察者狀態(tài)發(fā)生變化就自動調(diào)用被觀察者的更新方法。
? ? ? 14.模板方法:定義一個算法骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結(jié)構(gòu)即可重新定義該算法的某些步驟。
? ? ??
? ? ? 模板方法一般在TemplateMethod方法中定義了調(diào)用幾個抽象方法PrimitiveOperation的調(diào)用順序,而PrimitiveOperation的實現(xiàn)延遲到子類,這樣可以根據(jù)子類的需要實現(xiàn)不同的執(zhí)行行為,但是總的算法骨架沒有改變。這樣在節(jié)省重復(fù)代碼的情況下確保了子類實現(xiàn)的靈活性。常用于創(chuàng)建各種框架。
? ? ? 15 命令模式:將一個請求封裝成一個對象,從而使你可用不同的請求對客戶進行參數(shù)化。也可以對請求進行排隊或者記錄請求日志以及支持撤銷操作。
? ? ??
? ? ? Receiver只在意接收到的對象是否實現(xiàn)了Command接口,命令類將請求封裝在execute方法中,Receiver只要在需要的地方調(diào)用命令的execute方法即可,Receiver甚至不知道調(diào)用的命令是做什么的,實現(xiàn)了調(diào)用者和命令的解耦。
? ? 16 狀態(tài)模式:允許一個對象在內(nèi)部狀態(tài)改變時改變它的行為,讓對象看起來似乎修改了它的類。
? ? ?
? ? ?一般將狀態(tài)封裝為獨立的類,并將動作委托到當(dāng)前狀態(tài)對象,而Cotext狀態(tài)的切換,是在狀態(tài)類中完成的。實現(xiàn)了Cotext和狀態(tài)類的解耦,讓狀態(tài)種類發(fā)生變化時系統(tǒng)修改起來很方便,可避免大量的判斷語句。
? ? 17 職責(zé)鏈模式:使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接受者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
? ??
? ? 各個處理對象通過SetSuccessor設(shè)置下一個處理對象,當(dāng)自己無法處理時就將請求交給下一個對象,于是形成職責(zé)鏈,從而實現(xiàn)了請求和處理者的解耦,可避免大量的判斷語句,也增加了職責(zé)鏈的靈活性(可動態(tài)修改)。
? ? ? ?
? ? 18 解釋器模式:給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
? ? ?
? ? ??
? ? 19 中介者模式:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地互相引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
? ??
? ? ?Mediator是各個Colleague的中介者,各個Colleague的交互都要通過中介者完成,實現(xiàn)了各個Colleague的解耦。
? ?20 訪問者模式:表示一個作用于某對象結(jié)構(gòu)中的各個元素的操作。它使你可以在不改變個 元素的類的前提下定義作用于這些元素的新操作。
? ?
? ? ?
? ? ? ? 訪問者模式將數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)之上的操作之間的耦合解脫開,使得操作可以相對自由地演化,適用于數(shù)據(jù)結(jié)構(gòu)比較穩(wěn)定,又有易于變化的算法的情形。
? ?21 策略模式:定義了一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換。本模式使得算法可以獨立于它們的客戶而變化。
? ??
? ?策略模式實現(xiàn)了算法和算法實用類的解耦,算法之間也消除了耦合,使得算法的替換變得靈活方便。
? ?22 備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣可以在以后將對象恢復(fù)到原先保存的狀態(tài)。
? ?
? ? Originator的狀態(tài)被保存在了Memento中,Memento由Caretaker保管,不會影響到客戶端。
? ?23 迭代器模式:提供一種方法順序訪問聚合對象中各個元素,而不需要暴露該對象的內(nèi)部表示。
? ?
? ? ?迭代器Iterator將遍歷一個聚合對象的算法封裝起來。客戶端只要得到一個實現(xiàn)Iterator接口的類對象的迭代器,就可以用統(tǒng)一的方式對聚合對象進行迭代操作。
總結(jié)
以上是生活随笔為你收集整理的调侃《Head First设计模式》之总结篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2440):axios处理文章
- 下一篇: pk8/pem秘钥转keystore格式