23個設(shè)計模式列表
創(chuàng)建型模式... 2
1. Abstract Factory.. 2提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類。
2. Builder 2 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
3. Factory Method.. 3定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。使一個類的實例化延遲到其子類。
4. Prototype.. 3用原型實例指定創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象。
5. Singleton. 3 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
結(jié)構(gòu)型模式... 4
1. Adapter. 4將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。
2. Bridge.. 4將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立的變化。
3. Composite.. 5將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。
4. Decorator. 5動態(tài)地給一個對象添加一些額外的職責(zé)。
5. Façade.. 6為子系統(tǒng)中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
6. Flyweight. 6運用共享技術(shù)有效地支持大量細粒度的對象。
7. Proxy.. 7為其它對象提供一種代理以控制對這個對象的訪問。
行為模式... 7
1. Chain of Responsibility. 7 使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。
2. Command. 7 將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤消的操作。
3. Interpreter. 8給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語句中的句子。
4. Iterator 8 提供一種方法順序訪問一個聚合對象中的各個元素,而不需要暴露該對象的內(nèi)部表示。
5. Mediator 8 用一個中介對象來封裝一系列的對象交互。
6. Memento.. 9在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。
7. Observer 9 定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動更新。
8. State.. 9允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。
9. Strategy. 10 定義一系列的算法,把它們一個個封裝起來,并且使它們可以相互替換。
10. Template Method.. 10定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。
11. Visitor. 10表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。
共5種
抽象工廠
提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類。(別名:Kit)
實例描述:
交互圖
優(yōu)缺點
優(yōu)點:(1)封裝創(chuàng)建過程??蛻舨挥弥李悘S是如何創(chuàng)建類實例的,類廠封閉了所有創(chuàng)建的細節(jié)。這樣可選擇不同的創(chuàng)建方法,增加了靈活性。 (2)將客戶與具體類隔離,提高了各自的可重用性。
缺點:Factory類層次與具體類層次通常是平行的(即一一對應(yīng)的)。增加一個具體類,一般也要相應(yīng)地增加一個factory類,增加了系統(tǒng)復(fù)雜度。
實現(xiàn)
(1)Abstract Factory類中通常是一組Factory Method的集合。個人認為與Factory Method模式?jīng)]有本質(zhì)區(qū)別。
(2)通??梢园压S作為單件。
生成器
將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
各類之間的交互關(guān)系如下圖所示:
工廠方法
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。使一個類的實例化延遲到其子類。(別名:虛構(gòu)造器 Virtual Constructor)
原型
用原型實例指定創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象。
單件
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
共7種
適配器
將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些類可以一起工作。(別名:包裝器 Wrapper)
橋接
將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立的變化。(別名:Handle/Body)
例如
組合
將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得用戶對單個對象和組合對象的使用具有一致性。
裝飾
動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,Decorator模式相比生成子類更為靈活。(別名:包裝器Wrapper)
外觀
為子系統(tǒng)中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
享元
運用共享技術(shù)有效地支持大量細粒度的對象。
這么模式中最重要的概念是內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部狀態(tài)存儲于flyweight中,包含了獨立于flyweight場景的外部狀態(tài),這些信息使得flyweight可以被共享;外部狀態(tài)取決于flyweight場景,并根據(jù)場景變化,因此不可共享。用戶負責(zé)在必要的時候?qū)⑼獠繝顟B(tài)傳遞給flyweight.
1) Remote Proxy 可以隱藏一個對象存在于不同地址空間的事實;
2) Virtual Proxy 可以進行優(yōu)化,例如在顯示包含大圖片的文檔時,在初始時可以不顯示圖片,只顯示圖片的大小,根據(jù)需要再創(chuàng)建圖片對象,顯示圖片;
3) Protection Proxies 可以在訪問一個對象是附加一些內(nèi)務(wù)處理,如權(quán)限驗證等
4) Smart Reference 可以智能地管理代理引用的對象,如對引用的對象記數(shù),沒有引用時釋放對象;為引用對象加鎖等;
代理
為其它對象提供一種代理以控制對這個對象的訪問。(別名:Surrogate)
共11種
職責(zé)鏈
使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
CoR的優(yōu)點:
因為無法預(yù)知來自外界的請求是屬于哪種類型,每個類如果碰到它不能處理的請求只要放棄就可以。無疑這降低了類之間的耦合性。
缺點是效率低,因為一個請求的完成可能要遍歷到最后才可能完成,當(dāng)然也可以用樹的概念優(yōu)化。 在Java AWT1.0中,對于鼠標(biāo)按鍵事情的處理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR
擴展性差,因為在CoR中,一定要有一個統(tǒng)一的接口Handler.局限性就在這里。
命令
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤消的操作。(別名:動作 Action 事務(wù) Transaction)
解釋器
給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語句中的句子。
迭代器
提供一種方法順序訪問一個聚合對象中的各個元素,而不需要暴露該對象的內(nèi)部表示。(別名:游標(biāo) Cursor)
中介者
用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
備忘錄
在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。(別名:Token)
對象交互圖
一般情況下,Memento要存取Originator的私有數(shù)據(jù),一種方法是把Memento設(shè)為Originator的友元,讓Memento自己來取數(shù)據(jù)。另一種方法是Originator自己把自己的私有數(shù)據(jù)告訴給Memento。
觀察者
定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動更新。(別名:依賴Dependents,發(fā)布-訂閱 Publish-Subscribe)
狀態(tài)
允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它的類。(別名:狀態(tài)對象 Objects for States)
策略
定義一系列的算法,把它們一個個封裝起來,并且使它們可以相互替換。本模式使得算法可以獨立于使用它的客戶而變化。(別名:政策 Policy)
模板方法
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
訪問者
表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。