《圖解設計模式》學習筆記
zhouer / 2022-04-26
相關代碼。
Iterator 模式
用於在數據集合中按照順序遍歷集合。
- next() 返回當前元素,並指向下一個元素;
- hasNext() 確認接下來是否可以調用 next 方法。
Adapter 模式
- target 負責定義所需要的方法;
- client 負責使用 target 所定義的方法,即具體的業務實現;
- adaptee 被適配的一方,即提供方法具體實現的一方;
- adapter 使用 adaptee 已有的功能滿足 target 的需求,適配器本體。
類適配器模式:使用繼承類和繼承要求實現方法的接口,重寫接口方法時調用父類方法實現包裝。
對象適配器模式:利用被包裝類的具體實現的方法調用實現包裝,即在適配器中創建一個被包裝類的實例。
Template Method 模式
在父類中定義處理流程的框架,在子類中實現具體處理
- AbstractClass 負責聲明在模板方法中所使用到的抽象方法和實現模板方法;
- ConcreteClass 負責實現 AbstractClass 定義的抽象方法。
Factory Method 模式
- Product 屬於框架的一部分,是一個抽象類,定義了工廠生產出的實例所持有的接口,具體的實現由子類決定;
- Creator 屬於框架的一部分,是負責生產產品的抽象類,不使用 new 關鍵字來生產實例,而是調用生產實例的專門方法(即在 create 方法中對 createProduct 抽象方法的調用),這樣可以防止父類與其他具體類的實現。
- ConcreteProduct Product 的具體實現;
- ConcreteCreator Creator 的具體實現。
Singleton 模式
單例。
Prototype 模式
根據實例來生成新實例。
- Prototype 負責定義用於復製現有實例來生成新實例的方法,構成 client 與 prototype 具體實現類的中介,達成解耦;
- ConcretePrototype 負責實現復製現有實例並生成新實例的方法,即實現 createClone 方法;
- Client 負責使用復製實例的方法生成新的實例,采用註冊中心的形式,調用 Prototype 的 createClone 方法實現復製。
Builder 模式
- Builder 負責定義用於生成實例的接口;
- ConcreteBuilder Builder 的具體實現,還定義了處理結果的返回方法;
- Direct 負責使用 Builder 的接口來生成實例,不直接依賴於 ConcreteBuilder,只與 Builder 發生關系;
- Client Builder 模式的使用者,調用Direct 後傳入ConcreteBuilder 的實例實現 build 過程。
Abstract Factory 模式
- AbstractProduct 負責定義 AbstractFactory 所生產的抽象零件和產品的接口;
- AbstractFactory 負責定義用於生成抽象產品的接口;
- Client 調用AbstractProduct 和 AbstractFactory 的接口來工作;
- ConcreteProduct 負責實現 AbstractProduct 的接口;
- ConcreteFactory 負責實現 AbstractFactory 的接口;
易於增加具體的工廠,難以增加新的零件。
Bridge 模式
將類的功能層次結構和實現層次結構連接,即對接口添加功能的需求和對接口規定 API 不同實現的需求。Bridge 模式將兩者區隔開並創建一個連接通道。
- Abstraction 位於功能層次結構的最上層,在其中維持一個 Implementor 實現類,調用其方法;
- RefinedAbstraction 繼承 Abstraction,添加新功能;
- Implementor 位於實現層次結構的最上層,作為接口規定 API ,並被 Abstraction 調用;
- ConcreteImplementor 實現 Implementor 接口。
繼承是強關聯,委托是弱關聯(方法調用)。
Strategy 模式
整體替換。
- Strategy 負責提供策略所必須要的接口;
- ConcreteStrategy 具體實現策略;
- Context 負責使用 Strategy。
Composite 模式
使容器和內容具有一致性,創造出遞歸結構。
- Leaf 表示內容,類似葉子節點,其中不能加入其他角色;
- Composite 容器,可放入容器與內容;
- Component Leaf 和 Composite 的父類,統一兩者;
- Client 調用 Composite 模式者。
Decorator 模式
嵌套裝飾。
- Component 增加功能時的核心角色,所有成員的最高父類;
- ConcreteComponent Component 的具體實現類;
- Decorator 裝飾物,和 Component 具有相同的接口,內部保存了被裝飾的對象;
- ConcreteDecorator Decorator 的具體實現,也可被裝飾。
重點在於裝飾物與被裝飾物具有一致性(具有相同的接口),裝飾物包裹被裝飾物後依舊可以調用接口,采用委托的形式實現了功能的疊加。
Visitor 模式
在 Visitor 中規定 visit 方法(可重載以拓展功能),在被訪問對象中定義 accept 方法,傳入 Visitor 實例調用其 visit 方法,達到將處理都集中在 Visitor 中的目的。
- Visitor 負責對數據結構中的每個具體元素聲明一個用於訪問的方法;
- ConcreteVisitor 實現 Visitor 規定的接口,在 visit 方法進行中其內部狀態可以變化,即是一種類似遞歸的狀態;
- Element 訪問對象的接口,聲明 accept 方法;
- ConcreteElement 負責實現 Element 的接口;
- ObjectStructure 負責處理 Element 的集合。
Chain of Responsibility 模式
將多個對象組成一條職責鏈,按照順序一個一個地找出到底應該誰來負責處理。
- Handler 定義了處理者的接口,維持了下一個處理者;
- ConcreteHandler 各種 Handler 的具體實現,組成處理鏈條;
- Client 向第一個 ConcreteHandler 發送請求的角色。
Facade 模式
- Facade 代表構成系統的許多其他角色的「簡單窗口」,對內作為協調者實現方法,對外暴露接口以供調用;
- 被調用者 只實現自己的功能模塊,與其他模塊不相交;
- Client Facade的調用者。
Mediator 模式
Mediator 負責定義與 Colleague 之間進行通訊和做出決定的接口;ConcreteMediator 實現接口;Colleague 定義與 Mediator 之間進行通訊和做出決定的接口;ConcreteColleague 實現接口。
由 Mediator 創建和管理所有的 Colleague 組件,具體來說就是就是在每個 Colleague 中註冊 Mediator,在Mediator 中註冊每一個 Colleague ,保持兩者之間的通訊,在此基礎上,實現 Colleague 向 Mediator 報告每一次狀態變化,根據變化 Mediator 調用 Colleague 統一的接口實現不同的需求(該接口由各個 Colleague 實現類具體實現)。
Observer 模式
- Subject 定義了註冊觀察者和刪除觀察者的方法,聲明通知觀察者的接口(調用不同觀察者的不同具體實現);
- ConcreteSubject 自身發生變化時執行通知觀察者的行為;
- Observer 接受通知,聲明 update 方法;
- ConcreteObserver 具體實現不同功能的 update 方法, update 方法會在被通知後調用,獲取觀察對象的最新狀態。
具體的說,Observer 只是提供了對觀察對象的處理方法(該方法需要傳入觀察對象或需要的屬性),在每次觀察對象狀態變化時,由觀察對象自身在已註冊的Observer 中遍歷調用這一處理方法;這一角度看來 Observer 可以被看做只是數據處理方法的提供者,實現了數據自身與其的解耦。
Memento 模式
在保存和恢復實例時保護對象的封裝性。
- Originator 在保存自己的最新狀態時生成 Memento。當把以前保存的Memento傳遞給 Originator 時會將自己恢復成Memento的狀態;
- Memento 保存 Originator 的內部信息作為快照,並且不會向外暴露接口,只有同個包內的 Originator 才能訪問;可以采用寬接口和窄接口兩種API模式,即對 get 方法的權限修飾詞采用默認或 public。
- CareTaker 在需要保存 Originator 的狀態時,會調用Originator 的方法生成 Memento 實例,並一直保存一個Memento ,只能調用 Memento 的窄接口,不能訪問 Memento 的其他內部信息。
就是隔離快照和使用者的一種模式。(非常草率)
State 模式
將復雜的 if-else 狀態判斷拆分成一個個表示狀態的 State 類,在Context 中直接調用 State 實例的方法,這些方法在不同的 State 中有不同的實現,State 實現類中也有切換狀態的方法,即切換成不同的 ConcreteState 。
Flyweight 模式
通過共享實例減少 new 實例。
- Flyweight 被輕量化的類,只在需要的時候被 FlyweightFactory 創建一個實例然後被復用;
- FlyweightFactory 工廠類,通常是單例的,在需要時生產並保存一個 Flyweight 實例;
Proxy 模式
代理模式。
Command 模式
- Command 定義命令的接口;
- ConcreteCommand 實現接口;
- Receiver 執行命令時的對象,接收命令;
- Invoker 調用 Command 的接口方法 excute。
Interpreter 模式