其他設計模式 👉 23種設計模式(C++)🔗
每一種都有對應理解的相關代碼示例 → Git原碼 ⌨
組件協作
現代軟件專業分工之后的第一個結果是“框架與應用程序的划分”,“組件協作”模式通過晚期綁定,來實現框架與應用程序之間的松耦合,是二者之間協作時常用的模式。
Template Method
動機(Motivation)
-
在軟件構建過程中,對於某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由於固有的原因(比如框架與應用之間的關系)而無法和任務的整體結構同時實現。
-
如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求?
結構化軟件設計流程

面向對象軟件設計流程

早綁定與晚綁定

模式定義
- 定義一個操作中的算法的骨架 (穩定),而將一些步驟延遲(變化)到子類中。Template Method使得子類可以不改變(復用)一個算法的結構即可重定義(override 重寫)該算法的某些特定步驟。
——《設計模式》GoF
結構(Structure)

要點總結
-
Template Method模式是一種非常基礎性的設計模式,在面向對象系統中有着大量的應用。它用最簡潔的機制(虛函數的多態性)為很多應用程序框架提供了靈活的擴展點,是代碼復用方面的基本實現結構。
-
除了可以靈活應對子步驟的變化外,“不要調用我,讓我來調用你”的反向控制結構是Template Method的典型應用。
-
在具體實現方面,被Template Method調用的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),但一般推薦將它們設置為protected方法。
Observer / Event
容易違背依賴倒置原則(DIP)
動機(Motivation)
-
在軟件構建過程中,我們需要為某些對象建立一種“通知依賴關系” ——一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知。如果這樣的依賴關系過於緊密,將使軟件不能很好地抵御變化。
-
使用面向對象技術,可以將這種依賴關系弱化,並形成一種穩定的依賴關系。從而實現軟件體系結構的松耦合。
模式定義
定義對象間的一種一對多(變化)的依賴關系,以便當一個對象(Subject)的狀態發生改變時,所有依賴於它的對象都得到通知並自動更新。
——《設計模式》GoF
結構(Structure)

要點總結
-
使用面向對象的抽象,Observer模式使得我們可以獨立地改變目標與觀察者,從而使二者之間的依賴關系達致松耦合。
-
目標發送通知時,無需指定觀察者,通知(可以攜帶通知信息作為參數)會自動傳播。
-
觀察者自己決定是否需要訂閱通知,目標對象對此一無所知。
-
Observer模式是基於事件的UI框架中非常常用的設計模式,也是MVC模式的一個重要組成部分。
Strategy
if-else的bad smell 對於條件判斷80%可以考慮到策略模式
動機(Motivation)
-
在軟件構建過程中,某些對象使用的算法可能多種多樣,經常改變,如果將這些算法都編碼到對象中,將會使對象變得異常復雜;而且有時候支持不使用的算法也是一個性能負擔。
-
如何在運行時根據需要透明地更改對象的算法?將算法與對象本身解耦,從而避免上述問題?
模式定義
定義一系列算法,把它們一個個封裝起來,並且使它們可互相替換(變化)。該模式使得算法可獨立於使用它的客戶程序(穩定)而變化(擴展,子類化)。
——《設計模式》GoF
結構(Structure)

要點總結
-
Strategy及其子類為組件提供了一系列可重用的算法,從而可以使得類型在運行時方便地根據需要在各個算法之間進行切換。
-
Strategy模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的代碼通常都需要Strategy模式。
-
如果Strategy對象沒有實例變量,那么各個上下文可以共享同一個Strategy對象,從而節省對象開銷。
