設計模式之模板方法

—阿輝 發表於 2021-08-24
設計模式

模板方法介紹

模板方法模式是一種行為設計模式,它在超類中定義一個演算法的框架,允許子類在不修改結構的情況下重寫演算法的特定步驟。

模板

模板方法模式建議將演算法分解為一系列步驟,然後將這些步驟改為方法,最後在“模板方法”中依次呼叫這些方法。

步驟可以是抽象的,也可以有一些預設的實現。為了能夠使用演算法,客戶端需要自行提供子類並實現所有的抽象步驟(有時候還需要重寫步驟)。

模板方法將演算法分解為步驟,並允許子類重寫這些步驟,而非重寫實際的模板方法。

分解步驟

1、抽取步驟必須由各個子類來實現;

2、可選步驟已有一些預設實現,但仍可在需要時進行重寫。

模板方法的結構

  • 1、抽象類

宣告作為演算法步驟的方法,以及依次呼叫它們的實際模板方法。

演算法步驟可以被宣告為抽象類,預設提供一些實現。

  • 2、具體類

實現抽象方法的類,重寫所有步驟,但不能重寫模板方法自身。

適合場景

  • 1、當希望客戶端擴充套件某個特定演算法步驟,而不是整個演算法或其結構時。

  • 2、當多個類的演算法除了一些細微不同之處幾乎完全一樣時。

實現方式

1、分析目標演算法,確定能否將其分解為多個步驟(從所有子類的角度出發,考慮哪些步驟能夠通用,那些步驟各不相同)。

2、建立抽象基類並宣告一個模板方法和代表演算法步驟的一系列抽象方法(在模板方法中根據演算法結構依次呼叫相應步驟)。

對於預設的實現,可以給部分步驟帶來好處。同時可以考慮在演算法的關鍵之間新增鉤子。

3、為每個演算法變體新建一個具體子類,它必須實現所有的抽象步驟,也可以重寫部分可選步驟。

優點

1、你可僅允許客戶端重寫一個大型演算法中的特定部分,使得演算法其他部分修改對其所造成的影響減小。

2、可將重複的程式碼提取到一個超類中。

缺點

1、部分客戶端會受到演算法框架的限制。

2、會導致違法里氏替換原則,通過子類抑制預設步驟。

3、模板方法中步驟越多,後期的維護成本會增大。

Demo

它在基類中定義了一個演算法的框架,允許子類在不修改結構的情況下重寫演算法的特定步驟。

通常使用此模板方法來向框架使用者提供通過繼承實現的、對標準功能進行擴充套件的簡單方式

提供的抽象類

抽象類

實現抽象類的具體類

實現抽象類

客戶端和Main方法業務邏輯

客戶端和Main方法

首先我們可以看到在提供的抽象方法中,有一個模板方法,此方法用於執行基類宣告的演算法步驟。後面客戶端只需要呼叫此方法就可以完成交給不同子類的業務。

不同的子類,由於繼承相同的抽象類,首先必須實現抽象方法,其次可根據每個子類的業務需求各自來實現某些鉤子方法,此方法用於在子類中超長髮揮,各自都可以對進行變更,彼此不受影響。最後想要實現的是,我呼叫同樣的方法程式碼,後面宣告實現的兩個類會得到不同的顯示結果。

顯示的不同結果

由於1號沒有重寫鉤子方法,2號重寫了。所以當在模板方法中呼叫One()時,1號沒有進行任何操作,執行的是抽象類中的空方法,而2號重寫了,則輸出了重寫的方法。

小寄語

人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。

原創不易,給個關注。

我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。