天天看點

設計模式學習——模闆方法模式

一、什麼是模闆方法模式

模闆方法模式:定義一個操作的算法的架構,将一些步驟延遲到子類中,進而使得子類在不改變整體算法結構的基礎上即可重新定義該算法某些特點步驟。其類圖如下:

設計模式學習——模闆方法模式

從類圖我們可以看出來模闆方法非常簡單,它僅僅利用了繼承機制,其中AbstractClass為抽象模闆,他的方法分兩類:

基本方法

基本方法也叫基本操作,是由子類實作的方法,并在模闆方法中被調用。

模闆方法

可以有一個或多個,其主要實作對基本方法的排程,完成固定邏輯。

PS:為了防止模闆方法被惡意修改,一般會給模闆方法加上final關鍵字

二、模闆方法的應用

接下來我們通過一個簡單的例子說明此模式的使用。

我們設計了一款遊戲,在此遊戲中玩家可以選擇将自己的角色切換為不同職業,不同職業的移動、攻擊方式不同,但是其組合攻擊技的流程是一樣的,都需要釋放遠端技能,然後移動到目标處,最後釋放近戰技能。

我們首先設計抽象模闆:

解下來我們分别實作法師和弓箭手對應的實作類:

同理,我們可以設計出戰士、刺客的組合攻擊技。

 三、模闆方法優缺點

1、模闆方法的優點

封裝不變不分、擴充可變部分;

提取公共部分代碼、友善維護;

行為由父類控制,子類實作。

2、模闆方法的缺點

對每個不同的實作都需要定義一個子類,這會導緻類的個數增加,系統更加龐大,設計也更加抽象,間接地增加了系統實作的複雜度。

父類中的抽象方法由子類實作,子類執行的結果會影響父類的結果,這導緻一種反向的控制結構,它提高了代碼閱讀的難度。

由于繼承關系自身的缺點,如果父類添加新的抽象方法,則所有子類都要改一遍

四、模闆方法應用場景

1、多個子類有公有的方法,并且邏輯基本相同時;

2、重要複雜的算法,可以把核心算法設計成模闆,相關細節由子類實作;

3、項目重構時,模闆方法也是常用的方式,将相同代碼抽取到父類中,然後通過鈎子函數限制其行為。