多年後, 再次翻閱設計模式書籍, 將每種模式的要點總結於此, 需要本身有一定設計模式基礎, 再結合要點, 幫助更好理解與運用. ...
多年後, 再次翻閱設計模式書籍, 將每種模式的要點總結於此, 需要本身有一定設計模式基礎, 再結合要點, 幫助更好理解與運用.
- 策略模式 (Strategy)
- 附加功能單獨抽象不同介面
- 功能以組合方式引入抽象類
- 抽象類封裝功能模塊各調用
- 實現類可在構造中配置功能具體實現
- 觀察者模式 (Observer)
- 被訂閱者持有所有訂閱者
- 數據更新可以直接推送
- 數據更新也可以通知加拉取
- 大程度解耦觀察者與被訂閱者
- 裝飾器模式 (Decorator)
- 裝飾器介面的簡單實現叫做組件
- 持有組件對象的叫做裝飾器
- 裝飾是從裡層的裝飾器開始
- 最裡層的裝飾器會持有原始組件
- 各層通過對持有的底層對象進行包裝完成所謂裝飾並返回給上層
- 理論上可以做到一層套一層無窮盡
- 工場方法模式 (Factory Method)
- 解耦產品的實現與使用
- 產品需要進行抽象
- 工場方法定義創建產品的介面
- 工場方法內還可以封裝使用過程
- 子工場配置自己的創建邏輯
- 工場方法常常與抽象工場結合
- 抽象工場定義了一組產品的創建
- 工廠方法的實現又用這些產品創建或組件具體的大產品
- 工廠方法通過繼承來實現
- 抽象工場通過組合來實現(傳入)
- 單例模式 (Singleton)
- 全局實例註意記憶體
- 多線程需要特殊照顧
- 命令模式 (Command)
- 解耦發請求者與執行請求者
- 命令內部可以直接執行也可以代理給被封裝在內的接收者
- 命令支持撤銷
- 巨集命令包含多個命令同時調用
- 適配器模式 (Adapter)
- 對象適配器以組合來實現
- 類適配器以多繼承來實現
- 新舊系統共用可雙向適配
- 外觀模式 (Facade)
- 從抽象層次看與適配器很像
- 外觀模式創建新的簡單介面
- 適配器模式使用已存在介面
- 新介面包裝多個系統模塊簡化調用
- 老介面包裝其他系統達到相容
- 模板方法模式 (Template Method)
- 模板實現演算法, 子類實現步驟
- 子類與父類儘量不能成環
- 好萊塢模式為子類全為回調方法
- 有預設實現的為鉤子方法
- 策略用組合封裝演算法,模板用繼承封裝演算法
- 工廠方法是特殊的模板方法
- 迭代器模式 (Iterator)
- 解耦游走數組而不要關心具體類型
- 集合類都有自己的迭代器
- 一般的迭代器具備hasNext與next兩個方法
- 聚合器持有數據並創建迭代器
- 組合模式 (Composite)
- 組合模式的節點分為子節點與葉節點
- 子與葉都實現了同樣的組合介面,所謂透明性
- 子節點會額外實現add與get
- 為了葉節點安全也可以具有不同介面
- 組合模式可以與迭代器共生
- 迭代器需要配合棧來實現樹的遍歷
- 子節點可以實現空迭代器來減少Null判斷
- 狀態模式 (State)
- 與策略模式類圖相似
- 狀態介面定義狀態切換行為
- 所有狀態實現統一介面
- 狀態機定義並持有所有狀態
- 狀態機儲存當前狀態
- 狀態切換由不同狀態自己控制
- 狀態內通過持有的狀態機來切換下一狀態
- 代理模式 (Proxy)
- 可分為遠程代理與虛擬代理
- 與裝飾者很像
- 代理更多的是控制真實對象的訪問, 解耦客戶與真實對象, 也可能幫助創建真實對象
- 裝飾器更多是增加行為, 而且不創建對象
- 可通過工廠方法返回主體的代理
- 與適配器很像
- 代理不改變介面, 適配器改變介面
- 保護代理可以限制訪問部分介面,更像適配器
- 複合模式 (Compound)
- 多用幾種
- 比如MVC就融合了策略,組合,適配器等
一些冷門模式
- 橋接模式 (Bridge)
- 與策略模式很像
- 主體都依賴於功能組件的抽象
- 策略模式的主體是具體演算法的實現
- 橋接模式的主更抽象,需要子類來實現不同演算法
- 可以做到主體和功能組件解耦
- 增加了複雜度
- 生成器 (Builder)
- 封裝複雜對象的創建過程
- 隱藏內部實現
- 創建時需要對所創對象有更多認識
- 責任鏈 (Resposibility)
- 簡單理解為一個Handler的對象鏈
- 比如很多程式里常用的Dispatcher鏈
- 或者很多系統啟動時需要載入的數據鏈
- 不能保證一定會有對象對數據進行處理
- 享元 (Flyweight)
- 多個同樣的實例可被一個方法控制, 就可以封裝在一起輪詢數組進行處理
- 但是不能有獨立不同行為了
- 解釋器 (Interpreter)
- 主要是做簡單固定語法解析
- 抽象解釋介面, 並實現多個解釋器
- 如And, Or之類的, 可相互嵌套.
- 如果語法複雜, 種類繁多, 會不太適合
- 中介者 (Mediator)
- 解耦不同對象
- 它們只需要通知中介者, 中介者根據不同狀態來控制整個邏輯
- 可能會讓中介者邏輯過於複雜
- 備忘錄 (Momento)
- 將對象的儲存抽出來, 更好的維護了業務的內聚
- 一般會提供儲存與獲取介面
- 儲存過程可能會耗時
- 可能需要考慮序列化
- 原型 (Prototype)
- 提供複製對象的方法
- 比如clone
- 如果對象層次深,複製起來可能複雜
- 訪問者 (Visitor)
- 解耦對象與每個對象的具體操作, 如對電腦的不同部件進行不同操作
- 在對象種類變化小而操作變化大的時候使用
- 每一個對象實現visitor介面, 接受(accept)一個visitor,並把自己傳給visitor (visit)
- 缺點是具體元素對訪問者暴露, 而不是抽象介面
有很多種分類方式, 不必拘泥, 也可忽略.
- 分類方式 I
- 創建型
- 單例
- 抽象工廠
- 工廠方法
- 生成器
- 原型
- 行為型
- 模板方法
- 迭代器
- 狀態
- 策略
- 觀察者
- 命令
- 解釋器
- 中介者
- 訪問者
- 備忘錄
- 責任鏈
- 結構型
- 裝飾器
- 代理
- 外觀
- 組合
- 適配器
- 橋接
- 享元
- 創建型
- 分類方式 II
- 類
- 模板方法
- 工廠方法
- 適配器
- 解釋器
- 對象
- 單例
- 抽象工廠
- 裝飾器
- 代理
- 外觀
- 組合
- 適配器
- 迭代器
- 狀態
- 策略
- 觀察者
- 命令
- 橋接
- 享元
- 生成器
- 中介者
- 訪問者
- 備忘錄
- 責任鏈
- 原型
- 類