設計模式的核心在于提供了相關的問題的解決方案,使得人們可以更加簡單方便的復用成功的設計和體系結構。
按照設計模式的目的可以分為三大類。創建型模式與對象的創建有關;結構型模式處理類或對象的組合;行為型模式對類或對象怎樣交互和怎樣分配職責進行描述。
創建型 | 結構型 | 行為型 | |
---|---|---|---|
類 | 工廠模式 | 適配器類 | 解釋器 模版方法 |
對象 | 抽象工廠 生成器 原型 單例模式 | 適配器對象 橋接 組合 裝飾 外觀 享元 代理 | 責任鏈 命令 迭代器 中介者 備忘錄 觀察者 狀態 策略 訪問者 |
創建型設計模式:
創建型設計模式簡要辨析:
工廠 | 提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。 適用于: ·一個系統要獨立于他的產品創建、組合和表示時; ·一個系統要由多個產品系列中的一個來配置時; ·當要強調一系列相關的產品對象的設計以便進行聯合使用時。 |
抽象工廠 | 定義一個用于創建對象的接口,讓子類決定實例化哪一個類。 適用于: ·一個類不知道他所必須創建的對象的類的時候; ·當一個類希望由他的子類來指定他所創建的對象的時候; |
生成器 | 將一個復雜對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示。 適用于: ·當創建復雜對象的算法應該被獨立于該對象的組成部分以及他們的裝配方式時; ·當構造過程必須允許被構造的對象有不同表示時。 |
原型 | 用原型實例指定創建對象的種類,并且通過復制這些原型創建新的對象。 適用于: ·當一個系統應該獨立于他的產品的創建、構成和表示時; ·當要實例化的類是在運行時刻指定時。 |
單例 | 保證一個類僅有一個實例,并提供一個訪問他的全局訪問點。 適用于: ·當一個類只能有一個實例且客戶可以從一個眾所周知的訪問點訪問他時; ·當這個唯一的實例應該是通過子類化可擴展的,并且客戶無需更改代碼就能使用一個擴展的實例時。 |
結構型設計模式:
結構型設計模式簡要辨析:
適配器(類) | 將一個類的接口轉換成客戶希望的另一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。 適用于: ·想使用一個已經存在的類,而他的接口不符合要求; ·想創建一個可以服用的類,該類可以與其他不相關的類或不可預見的類協同工作; |
適配器(對象) | ·(僅適用于對象Adapter)想使用一個已經存在的子類,但是不可能對每一個都進行子類化以自動匹配他們的接口。對象適配器可以適配他的父類接口。 |
橋接 | 將抽象部分與其實現部分分離,使他們都可以獨立的變化。 適用于: ·不希望在抽象和他的實現部分之間有一個固定的綁定關系; ·類的抽象以及他的實現都應該通過生成子類的方法加以擴充; ·對一個抽象的實現部分的修改應對客戶不產生影響,即客戶不必重新編碼。 |
組合 | 使得用戶對單個對象和組合對象的使用具有一致性。 適用于: ·想表示對象的部分-整體層次結構; ·希望用戶忽略組合對象與單個對象的不同,用戶將統一的使用組合結構中的所有對象 |
裝飾器 | 動態的給一個對象添加一些額外的職責。 適用于: ·動態、透明的給單個對象添加職責; ·處理那些不可撤銷的職責。 |
外觀 | 為子系統中一組接口提供一個一致的界面。 適用于: ·要為一個復雜子系統提供一個簡單接口; ·客戶程序與抽象類的實現部分之間存在很大依賴性。 |
享元 | 運用共享技術有效的支持大量細粒度的對象。 適用于: ·一個應用程序使用了大量的對象; ·完全由于使用大量的對象,造成很大存儲的開銷; ·對象的大多數狀態都可以變為外部狀態。 |
代理 | 為其他對象提供一種代理以控制這個對象的訪問。 適用于: ·遠程代理(Remote Proxy)為一個對象在不同地址空間提供局部代表; ·虛代理(Virtual Proxy)根據需要創建開銷很大的對象 ·…… |
行為設計模式:
解釋器 | 給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。 適用于: ·該文法簡單; ·效率不是一個關鍵問題。 |
模版方法 | 定義一個操作中的算法骨架,而將一些步驟延遲到子類中。 適用于: ·一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現; ·各子類中公共的行為應被提取出來并集中到一個公共父類中,避免代碼重復。 |
責任鏈 | 使多個對象都有機會處理請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,知道有一個對象處理它為止 適用于: ·有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定; ·想在不明確指令接受者的情況下向多個對象提交一個請求; ·可處理一個請求的對象集合應被動態指定。 |
命令 | 將一個請求封裝成一個對象,從而使得可以用不同的請求對客戶端進行參數化。 適用于: ·抽象出待執行的動作以參數化某對象; ·在不同時刻指定、排列和執行請求; ·支持取消操作。 |
迭代器 | 提供一種方法順序訪問一個聚合對象中的各個元素,且不需要暴露該對象的內部表示。 適用于: ·訪問一個聚合對象的內容而無需暴露他的內部表示; ·支持對聚合對象的多種遍歷; ·為遍歷不同的聚合結構提供一個統一的接口 |
中介者 | 用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變他們之間的交互。 適用于: ·一組對象以定義良好但是復雜的方式進行通信,產生的相互依賴關系結構混亂且難以理解; ·一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象; ·想定制一個分布在多個類中的行為,而又不想生成太多的子類。 |
備忘錄 | 在不破壞封裝性的前提下捕獲一個對象的內部狀態,并在對象之外保存這個狀態,這樣以后就可以恢復到原先保存的狀態。 適用于: ·必須保存一個對象在某一個時刻(部分)的狀態; ·直接用接口來讓其他對象得到狀態會暴露對象的實現細節并破壞封裝性。 |
觀察者 | 當一個對象的狀態發生改變時,所有依賴于他的對象都得到通知并被自動更新。 適用于: ·當一個對象的改變需要同時改變其他對象,而不知道具體有多少對象有待改變; ·當一個對象必須通知其他對象,而又不能假定其他對象是誰。 |
狀態 | 允許一個對象在其內部狀態改變時改變他的行為。對象看起來似乎修改了他的類。 適用于: ·一個對象的行為決定于他的狀態,并且必須在運行時根據狀態改變他的行為。 |
策略 | 定義一系列的算法,把它們封裝起來,并且使他們可以相互替換,使得算法可以獨立于使用他們的客戶而變化。 適用于: ·許多相關的類僅僅是行為有異; ·需要使用一個算法的不同變體; ·算法使用客戶不應該知道的數據; ·一個類定義了多種行為。 |
訪問者 | 允許在不改變各類元素的類的前提下定義作用于這些元素的新操作。 適用于: ·一個對象結構包含很多類對象,它們有不同的接口,而用戶想對這些對象實施一些依賴于其具體類的操作; ·定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。 |
創建型有四五,工廠原型單例數;
結構型有六,適配橋接裝飾顧;
代理組合和外觀,享元也是其中屬;
行為型有十一,模板策略責任聚;
命令查詢觀察者,狀態訪問中介續;
迭代器和解釋,行為模式心中記。