跳至內容
Bluebean 的筆記
Go back

設計模式筆記—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 這其實也間接表示,用什麼模式其實要看使用場合以及團隊對業務的看法


分享文章:

Previous
設計模式筆記
Next
設計模式筆記—Strategy Pattern