23種設計模式之模板方法模式

模板方法模式的定義

定義一個操作中的算法的框架,而將一些步驟延遲到子類中. 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟.

通俗的講,就是將子類相同的方法, 都放到其抽象父類中

類圖如下:

其中, AbstractClass 叫抽象模板, 它的方法分為以下兩類:

基本方法, 基本方法也叫做基本操作, 是由子類實現的方法, 並且在模板方法被調用模板方法, 可以有一個或幾個, 一般是一個具體方法, 也就是一個框架, 實現對基本方法的調度, 完成固定邏輯, 一般模板方法都加上final關鍵字, 不允許被覆寫, 以防止惡意的操作

ConcreteClass1和ConcreteClass2叫做具體模板, 實現父類所定義的一個或多個抽象方法, 也就是父類定義的基本方法在子類中得以實現.

抽象模板類實現代碼如下:

具體類實現基本方法.

模板方法模式的應用

模板方法模式的優點

封裝不可變部分,擴展可變部分. 把認為是不變部分的算法封裝到父類實現,而可變部分的則可以通過繼承來繼續擴展提取公共部分代碼,便於維護. 試想, 如果我們不抽取到父類,維護人員為了修正一個缺陷,需要到處查找類似的代碼行為有父類控制,子類實現. 基本方法是由子類實現的, 因此子類可以通過擴展的方式增加相應的功能, 符合開閉原則

模板方法模式的缺點

按照我們的設計習慣, 抽象類負責聲明最抽象,最一般的食物屬性和方法, 實現類完成具體的事物屬性和方法. 但是模板方法模式卻顛倒了, 抽象類定義了部分抽象方法, 由子類實現, 子類執行的結果影響了父類的結果, 也就是子類對父類產生了影響, 這在複雜的項目中,會帶來代碼閱讀的難度, 而且也會讓新手產生不適感

模板方法模式的使用場景

多個子類有公有的方法,並且邏輯基本相同重要、複雜的算法, 可以把核心算法設計成模板方法, 周邊的相關細節功能則由各個子類實現重構時, 模板方法模式是一個經常使用的模式, 把相同的代碼抽取到父類中,然後通過鉤子函數約束其行為

模板方法模式的擴展

將上面的 AbstractClass 抽象類修改後代碼如下:

子類實現 isRun() 方法, 通過子類的不同實現,可以影響到公共代碼的執行, 暗爽

也就是說外界條件改變,影響到模板方法的窒息那個. 在我們抽象類中 isRun 的返回值就影響了模板方法的執行結果, 該方法就叫做鉤子方法.

模板方法模式就是在模板方法中按照一定的規則和順序調用基本方法.

使用模板方法模式, 是非常容易擴展的一種模式