多年后, 再次翻閱設計模式書籍, 將每種模式的要點總結于此, 需要本身有一定設計模式基礎, 再結合要點, 幫助更好理解與運用.
-
策略模式 (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
- 類
- 模板方法
- 工廠方法
- 配接器
- 解釋器
- 物件
- 單例
- 抽象工廠
- 裝飾器
- 代理
- 外觀
- 組合
- 配接器
- 迭代器
- 狀態
- 策略
- 觀察者
- 命令
- 橋接
- 享元
- 生成器
- 中介者
- 訪問者
- 備忘錄
- 責任鏈
- 原型
- 類
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/42105.html
標籤:設計模式
上一篇:JAVA設計模式---單例模式篇
下一篇:設計模式-行為型-模板模式
