設計模式筆記—Template Method Pattern

Template Method Pattern 用於建立通用流程,並透過繼承的方式讓子類別實現流程的細節
以我個人的理解,就是建立一套抽象的 SOP 流程,細節則依照業務的不同而有所差異

Template Method Pattern 是一個簡單好用的模式,雖然靈活性不高,但是容易實作
可以用在各種場合,只要覺得大體流程相似就可以套用

這邊會以一個簡單的遊戲類別當例子:

public abstract class Game {
protected bool IsRunning { get; set; } = false;
public abstract void Initialize(); // 初始化
public abstract void Update(); // 更新遊戲狀態
public abstract void Render(); // 繪製遊戲畫面
public void Run() {
this.Initialize();
this.IsRunning = true;
while (this.IsRunning) {
this.Update();
this.Render();
}
}
}

在上面的程式中,可以看到一個抽象的 Game 類別
Run() 方法就是 Template Method
裡面是簡單的遊戲運作流程,先初始化,然後進到迴圈內不斷得更新與繪製畫面
其中的 Initialize()Update()Render() 都交由子類別自己實現,比如:

class MyGame : Game {
private Player player;
public override void Intialize() {
this.player = new Player();
}
public override void Update() {
this.player.Update();
}
public override void Render() {
this.player.Render();
}
}

思考模式的概念

Template Method Pattern 模式偏重在抽象流程
也因此這個模式需要透過繼承來使用

有些業務可以被一起歸納成抽象的業務概念,這種業務概念會有一套既定的流程
流程少部份的細節會不太一樣,但大體上都是照著既定的流程跑,也因此使用到繼承這種關係比較強烈的詞彙

將相似的概念抽出來獨立成業務概念的類別是有好處的
這樣可以更專注在實際的業務細節上
例如說,前面講解的 Game 類別就是將遊戲的整體架構抽成一個概念
之後實作時只要關注 Initlaizle()Update()Render() 分別需要做什麼就好

與 Strategy Pattern 的比較

無暇的程式碼—敏捷完整篇 書中,Template Method Pattern 與 Strategy Pattern 是被編在一起介紹的
兩個模式的概念類似,前者是透過繼承,後者則是透過依賴注入

不過我認為兩者在根本上的概念並不相同
Template Method Pattern 重在共通的抽象概念,關聯性強,靈活度低
Strategy Pattern 則重在各種可使用的方法上,關聯性低,靈活度高

有關 Strategy Pattern 的介紹之後會再補連結
或者等文章出來時也可以直接透過 設計模式筆記 查看

後記

當初本來是要在放假的時候寫的,結果想不到要怎麼寫例子,就一直拖到退伍了

無暇的程式碼—敏捷完整篇書中的例子是 Application 跟 Sorter ,但是我覺得不好說明模式的概念,所以就選擇自己生例子
可惜的是,目前我還沒有碰到比較好的案例來說明,最後就選擇在維基上看到的遊戲類別了

若依照書中所描述,作者在一般情況下會偏好使用 Template Method Pattern 實作 Sorter ,這樣比較簡單
但是我會偏好 Strategy Pattern,因為比較的部份個人認為它屬於策略,自然就需要使用比較靈活的 Strategy Pattern
這其實也間接表示,用什麼模式其實要看使用場合以及團隊對業務的看法