天天看點

Refresh design pattern

多年後, 再次翻閱設計模式書籍, 将每種模式的要點總結于此, 需要本身有一定設計模式基礎, 再結合要點, 幫助更好了解與運用.

政策模式 (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)

缺點是具體元素對通路者暴露, 而不是抽象接口

https://mp.weixin.qq.com/s/istajwb_rhrslixr3mguiw