设计模式(Design Patterns)详解
設計模式(Design Patterns)
——可復用面向對象軟件的基礎一般會用到的:
Factory( 工廠模式)
Singleton(單例模式)
這兩個比較多
Proxy(代理模式)
Adapter(適配器模式)
Command(命令模式)
Observer(觀察者模式)
Facade(門面模式)
這些也會碰到
Template Method(模板方法模式)
Decorator(裝飾模式)
Iterator(迭代子模式)
至于其他的,遇見的可能不大,只有符合一定條件的需求才會用到吧。
筆試面試的時候應該準備什么:
設計模式的筆試主要是前3個的Demo,就是簡單的實現,比如單例的懶漢餓漢模式。
面試時,設計模式主要問該設計的好處,還有應用的場景吧。
設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式于己于他人于系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項目中合理的運用設計模式可以完美的解決很多問題,每種模式在現在中都有相應的原理來與之對應,每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案,這也是它能被廣泛應用的原因。本章系Java之美[從菜鳥到高手演變]系列之設計模式,我們會以理論與實踐相結合的方式來進行本章的學習,希望廣大程序愛好者,學好設計模式,做一個優秀的軟件工程師!
企業級項目實戰(帶源碼)地址:http://zz563143188.iteye.com/blog/1825168
23種模式java實現源碼下載地址 http://pan.baidu.com/share/link?shareid=372668&uk=4076915866#dir/path=%2F%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6設計模式23種通熟解釋和簡明教程: http://blog.csdn.net/langb2014/article/details/49616613
權威文檔《圖說設計模式》:http://design-patterns.readthedocs.io/zh_CN/latest/index.html
一、設計模式的分類
總體來說設計模式分為三大類:
創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
其實還有兩類:并發型模式和線程池模式。用一個圖片來整體描述一下:
二、設計模式的六大原則
1、開閉原則(Open Close Principle)
開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。所以一句話概括就是:為了使程序的擴展性好,易于維護和升級。想要達到這樣的效果,我們需要使用接口和抽象類,后面的具體設計中我們會提到這點。
2、里氏代換原則(Liskov Substitution Principle)
里氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。 里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。 LSP是繼承復用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范。—— From Baidu 百科
3、依賴倒轉原則(Dependence Inversion Principle)
這個是開閉原則的基礎,具體內容:真對接口編程,依賴于抽象而不依賴于具體。
4、接口隔離原則(Interface Segregation Principle)
這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。還是一個降低類之間的耦合度的意思,從這兒我們看出,其實設計模式就是一個軟件的設計思想,從大型軟件架構出發,為了升級和維護方便。所以上文中多次出現:降低依賴,降低耦合。
5、迪米特法則(最少知道原則)(Demeter Principle)
為什么叫最少知道原則,就是說:一個實體應當盡量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
6、合成復用原則(Composite Reuse Principle)
原則是盡量使用合成/聚合的方式,而不是使用繼承。
創建型
?
1. Factory Method(工廠方法)
?
2. Abstract Factory(抽象工廠)
?
3. Builder(建造者)
?
4. Prototype(原型)
?
5. Singleton(單例)
?
結構型
?
6. Adapter Class/Object(適配器)
?
7. Bridge(橋接)
?
8. Composite(組合)
?
9. Decorator(裝飾)
?
10. Facade(外觀)
?
11. Flyweight(享元)
?
12. Proxy(代理)
?
行為型
?
13. Interpreter(解釋器)
?
14. Template Method(模板方法)
?
15. Chain of Responsibility(責任鏈)
?
16. Command(命令)
?
17. Iterator(迭代器)
?
18. Mediator(中介者)
?
19. Memento(備忘錄)
?
20. Observer(觀察者)
?
21. State(狀態)
?
22. Strategy(策略)
?
23. Visitor(訪問者)
?
創建型
?
1. Factory Method(工廠方法)
?
意圖:
?
定義一個用于創建對象的接口,讓子類決定實例化哪一個類。Factory Method 使一個類的實例化延遲到其子類。
?
適用性:
?
當一個類不知道它所必須創建的對象的類的時候。
?
當一個類希望由它的子類來指定它所創建的對象的時候。
?
當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
?
2. Abstract Factory(抽象工廠)
?
意圖:
?
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
適用性:
?
一個系統要獨立于它的產品的創建、組合和表示時。
?
一個系統要由多個產品系列中的一個來配置時。
?
當你要強調一系列相關的產品對象的設計以便進行聯合使用時。
?
當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。
?
3. Builder(建造者)
?
意圖:
?
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
?
適用性:
?
當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。
?
當構造過程必須允許被構造的對象有不同的表示時。
?
4. Prototype(原型)
?
意圖:
?
用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
?
適用性:
?
當要實例化的類是在運行時刻指定時,例如,通過動態裝載;或者
?
為了避免創建一個與產品類層次平行的工廠類層次時;或者
?
當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型并克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。
?
5. Singleton(單例)
?
意圖:
?
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
?
適用性:
?
當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
?
當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。
?
結構型
?
6. Adapter Class/Object(適配器)
?
意圖:
?
將一個類的接口轉換成客戶希望的另外一個接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
適用性:
?
你想使用一個已經存在的類,而它的接口不符合你的需求。
?
你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
?
(僅適用于對象Adapter )你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。
?
7. Bridge(橋接)
?
意圖:
?
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
?
適用性:
?
你不希望在抽象和它的實現部分之間有一個固定的綁定關系。例如這種情況可能是因為,在程序運行時刻實現部分應可以被選擇或者切換。
?
類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時Bridge 模式使你可以對不同的抽象接口和實現部分進行組合,并分別對它們進行擴充。
?
對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的代碼不必重新編譯。
?
(C++)你想對客戶完全隱藏抽象的實現部分。在C++中,類的表示在類接口中是可見的。
?
有許多類要生成。這樣一種類層次結構說明你必須將一個對象分解成兩個部分。Rumbaugh 稱這種類層次結構為“嵌套的普化”(nested generalizations )。
?
你想在多個對象間共享實現(可能使用引用計數),但同時要求客戶并不知道這一點。一個簡單的例子便是Coplien 的String 類[ Cop92 ],在這個類中多個對象可以共享同一個字符串表示(StringRep )。
?
8. Composite(組合)
?
意圖:
?
將對象組合成樹形結構以表示“部分-整體”的層次結構。C o m p o s i t e 使得用戶對單個對象和組合對象的使用具有一致性。
適用性:
?
你想表示對象的部分-整體層次結構。
?
你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。
?
9. Decorator(裝飾)
?
意圖:
動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator 模式相比生成子類更為靈活。
適用性:
?
在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
?
處理那些可以撤消的職責。
?
當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。
?
10. Facade(外觀)
?
意圖:
?
為子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
?
適用性:
?
當你要為一個復雜子系統提供一個簡單接口時。子系統往往因為不斷演化而變得越來越復雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定制,但這也給那些不需要定制子系統的用戶帶來一些使用上的困難。Facade 可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定制性的用戶可以越過facade層。
?
客戶程序與抽象類的實現部分之間存在著很大的依賴性。引入facade 將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
?
當你需要構建一個層次結構的子系統時,使用facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關系。
?
11. Flyweight(享元)
?
意圖:
?
運用共享技術有效地支持大量細粒度的對象。
?
適用性:
?
一個應用程序使用了大量的對象。
?
完全由于使用大量的對象,造成很大的存儲開銷。
?
對象的大多數狀態都可變為外部狀態。
?
如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象。
?
應用程序不依賴于對象標識。由于Flyweight 對象可以被共享,對于概念上明顯有別的對象,標識測試將返回真值。
?
12. Proxy(代理)
?
意圖:
?
為其他對象提供一種代理以控制對這個對象的訪問。
?
適用性:
?
在需要用比較通用和復雜的對象指針代替簡單的指針的時候,使用Proxy模式。下面是一 些可以使用Proxy 模式常見情況:
1) 遠程代理(Remote Proxy )為一個對象在不同的地址空間提供局部代表。 NEXTSTEP[Add94] 使用NXProxy類實現了這一目的。Coplien[Cop92] 稱這種代理為“大使” (Ambassador )。
2 )虛代理(Virtual Proxy )根據需要創建開銷很大的對象。在動機一節描述的ImageProxy 就是這樣一種代理的例子。
3) 保護代理(Protection Proxy )控制對原始對象的訪問。保護代理用于對象應該有不同 的訪問權限的時候。例如,在Choices 操作系統[ CIRM93]中KemelProxies為操作系統對象提供 了訪問保護。
4 )智能指引(Smart Reference )取代了簡單的指針,它在訪問對象時執行一些附加操作。 它的典型用途包括:
?
對指向實際對象的引用計數,這樣當該對象沒有引用時,可以自動釋放它(也稱為SmartPointers[Ede92 ] )。
?
當第一次引用一個持久對象時,將它裝入內存。
?
在訪問一個實際對象前,檢查是否已經鎖定了它,以確保其他對象不能改變它。
?
行為型
?
13. Interpreter(解釋器)
?
意圖:
?
給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
?
適用性:
?
當有一個語言需要解釋執行, 并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當存在以下情況時該模式效果最好:
?
該文法簡單對于復雜的文法, 文法的類層次變得龐大而無法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構建抽象語法樹即可解釋表達式, 這樣可以節省空間而且還可能節省時間。
?
效率不是一個關鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現的, 而是首先將它們轉換成另一種形式。例如,正則表達式通常被轉換成狀態機。但即使在這種情況下, 轉換器仍可用解釋器模式實現, 該模式仍是有用的。
?
14. Template Method(模板方法)
?
意圖:
?
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
?
適用性:
?
一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現。
?
各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。這是Opdyke 和Johnson 所描述過的“重分解以一般化”的一個很好的例子[ OJ93 ]。首先識別現有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個調用這些新的操作的模板方法來替換這些不同的代碼。
?
控制子類擴展。模板方法只在特定點調用“hook ”操作(參見效果一節),這樣就只允許在這些點進行擴展。
?
15. Chain of Responsibility(責任鏈)
?
意圖:
?
使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
?
適用性:
?
有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
?
你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
?
可處理一個請求的對象集合應被動態指定。
?
16. Command(命令)
?
意圖:
?
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作。
?
適用性:
?
抽象出待執行的動作以參數化某對象,你可用過程語言中的回調(call back)函數表達這種參數化機制。所謂回調函數是指函數先在某處注冊,而它將在稍后某個需要的時候被調用。Command 模式是回調機制的一個面向對象的替代品。
?
在不同的時刻指定、排列和執行請求。一個Command對象可以有一個與初始請求無關的生存期。如果一個請求的接收者可用一種與地址空間無關的方式表達,那么就可將負責該請求的命令對象傳送給另一個不同的進程并在那兒實現該請求。
?
支持取消操作。Command的Excute 操作可在實施操作前將狀態存儲起來,在取消操作時這個狀態用來消除該操作的影響。Command 接口必須添加一個Unexecute操作,該操作取消上一次Execute調用的效果。執行的命令被存儲在一個歷史列表中。可通過向后和向前遍歷這一列表并分別調用Unexecute和Execute來實現重數不限的“取消”和“重做”。
?
支持修改日志,這樣當系統崩潰時,這些修改可以被重做一遍。在Command接口中添加裝載操作和存儲操作,可以用來保持變動的一個一致的修改日志。從崩潰中恢復的過程包括從磁盤中重新讀入記錄下來的命令并用Execute操作重新執行它們。
?
用構建在原語操作上的高層操作構造一個系統。這樣一種結構在支持事務( transaction)的信息系統中很常見。一個事務封裝了對數據的一組變動。Command模式提供了對事務進行建模的方法。Command有一個公共的接口,使得你可以用同一種方式調用所有的事務。同時使用該模式也易于添加新事務以擴展系統。
?
17. Iterator(迭代器)
?
意圖:
?
提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。
?
適用性:
?
訪問一個聚合對象的內容而無需暴露它的內部表示。
?
支持對聚合對象的多種遍歷。
?
為遍歷不同的聚合結構提供一個統一的接口(即, 支持多態迭代)。
?
18. Mediator(中介者)
?
意圖:
?
用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
?
適用性:
?
一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解。
?
一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象。
?
想定制一個分布在多個類中的行為,而又不想生成太多的子類。
?
19. Memento(備忘錄)
?
意圖:
?
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。
?
適用性:
?
必須保存一個對象在某一個時刻的(部分)狀態, 這樣以后需要時它才能恢復到先前的狀態。
?
如果一個用接口來讓其它對象直接得到這些狀態,將會暴露對象的實現細節并破壞對象的封裝性。
?
20. Observer(觀察者)
?
意圖:
?
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴于它的對象都得到通知并被自動更新。
?
適用性:
?
當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復用。
?
當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。
?
當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。
?
21. State(狀態)
?
意圖:
?
允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
?
適用性:
?
一個對象的行為取決于它的狀態, 并且它必須在運行時刻根據狀態改變它的行為。
?
一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常, 有多個操作包含這一相同的條件結構。State模式將每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴于其他對象而獨立變化。
?
22. Strategy(策略)
?
意圖:
?
定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。
?
適用性:
?
許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。
?
需要使用一個算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的算法。當這些變體實現為一個算法的類層次時[H087] ,可以使用策略模式。
?
算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與算法相關的數據結構。
?
一個類定義了多種行為, 并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。
?
23. Visitor(訪問者)
?
意圖:
?
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
?
適用性:
?
一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現。
?
各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。這是Opdyke和Johnson所描述過的“重分解以一般化”的一個很好的例子[OJ93]。首先識別現有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個調用這些新的操作的模板方法來替換這些不同的代碼。
?
控制子類擴展。模板方法只在特定點調用“hook ”操作(參見效果一節),這樣就只允許在這些點進行擴展。
??? ??? Christopher Alexander 說過:“每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復勞動”。 模式描述為:在一定環境中解決某一問題的方案,包括三個基本元素--問題,解決方案和環境。 閱讀類圖和對象圖請先學習UML 創建模式 結構模式 行為模式 創建模式:對類的實例化過程的抽象。一些系統在創建對象時,需要動態地決定怎樣創建對象,創建哪些對象,以及如何組合和表示這些對象。創建模式描述了怎樣構造和封裝這些動態的決定。包含類的創建模式和對象的創建模式。 ?? ??? 結構模式:描述如何將類或對象結合在一起形成更大的結構。分為類的結構模式和對象的結構模式。類的結構模式使用繼承把類,接口等組合在一起,以形成更大的結構。類的結構模式是靜態的。對象的結構模式描述怎樣把各種不同類型的對象組合在一起,以實現新的功能的方法。對象的結構模式是動態的。 行為模式:對在不同的對象之間劃分責任和算法的抽象化。不僅僅是關于類和對象的,并是關于他們之間的相互作用。類的行為模式使用繼承關系在幾個類之間分配行為。對象的行為模式則使用對象的聚合來分配行為。 設計模式使用排行:| 頻率 | 所屬類型 | 模式名稱 | 模式 | 簡單定義 |
| 5 | 創建型 | Singleton | 單件 | 保證一個類只有一個實例,并提供一個訪問它的全局訪問點。 |
| 5 | 結構型 | Composite | 組合模式 | 將對象組合成樹形結構以表示部分整體的關系,Composite使得用戶對單個對象和組合對象的使用具有一致性。 |
| 5 | 結構型 | FA?ADE | 外觀 | 為子系統中的一組接口提供一致的界面,facade提供了一高層接口,這個接口使得子系統更容易使用。 |
| 5 | 結構型 | Proxy | 代理 | 為其他對象提供一種代理以控制對這個對象的訪問 |
| 5 | 行為型 | Iterator | 迭代器 | 提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內部表示。 |
| 5 | 行為型 | Observer | 觀察者 | 定義對象間一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知自動更新。 |
| 5 | 行為型 | Template Method | 模板方法 | 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,Template Method使得子類可以不改變一個算法的結構即可以重定義該算法得某些特定步驟。 |
| 4 | 創建型 | Abstract Factory | 抽象工廠 | 提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們的具體類。 |
| 4 | 創建型 | Factory Method | 工廠方法 | 定義一個用于創建對象的接口,讓子類決定實例化哪一個類,Factory Method使一個類的實例化延遲到了子類。 |
| 4 | 結構型 | Adapter | 適配器 | 將一類的接口轉換成客戶希望的另外一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作。 |
| 4 | 結構型 | Decorator | 裝飾 | 動態地給一個對象增加一些額外的職責,就增加的功能來說,Decorator模式相比生成子類更加靈活。 |
| 4 | 行為型 | Command | 命令 | 將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進行參數化,對請求排隊和記錄請求日志,以及支持可撤銷的操作。 |
| 4 | 行為型 | State | 狀態 | 允許對象在其內部狀態改變時改變他的行為。對象看起來似乎改變了他的類。 |
| 4 | 行為型 | Strategy | 策略模式 | 定義一系列的算法,把他們一個個封裝起來,并使他們可以互相替換,本模式使得算法可以獨立于使用它們的客戶。 |
| 3 | 創建型 | Builder | 生成器 | 將一個復雜對象的構建與他的表示相分離,使得同樣的構建過程可以創建不同的表示。 |
| 3 | 結構型 | Bridge | 橋接 | 將抽象部分與它的實現部分相分離,使他們可以獨立的變化。 |
| 3 | 行為型 | China of Responsibility | 職責鏈 | 使多個對象都有機會處理請求,從而避免請求的送發者和接收者之間的耦合關系 |
| 2 | 創建型 | Prototype | 原型 | 用原型實例指定創建對象的種類,并且通過拷貝這些原型來創建新的對象。 |
| 2 | 結構型 | Flyweight | 享元 | 享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。 |
| 2 | 行為型 | Mediator | 中介者 | 用一個中介對象封裝一些列的對象交互。 |
| 2 | 行為型 | Visitor | 訪問者模式 | 表示一個作用于某對象結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個元素的新操作。 |
| 1 | 行為型 | Interpreter | 解釋器 | 給定一個語言,定義他的文法的一個表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。 |
| 1 | 行為型 | Memento | 備忘錄 | 在不破壞對象的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。 |
謀膽并重
總結
以上是生活随笔為你收集整理的设计模式(Design Patterns)详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS配置Tair
- 下一篇: 设计模式系列·王小二需求历险记(一)