首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 設計模式:模板方法模式詳解與咖啡/茶例子

     編輯:關於C++

模式定義

模板方法模式:定義一個操作中的算法骨架,將某些步驟延遲到子類中實現。基類封裝不變的流程,子類實現變化的細節。

核心角色

  • AbstractClass:定義模板方法 templateMethod()(final/非虛),調用基本操作 primitiveOperation1()、primitiveOperation2() 等。基本操作聲明為純虛函數或虛函數。
  • ConcreteClass:實現基本操作。
  • Hook 方法:基類提供默認實現(可為空),子類可選擇性覆蓋,用於微調流程。

與策略模式對比

維度模板方法模式策略模式
關係繼承組合
算法骨架基類固定,不可覆蓋Context 類中固定,策略接口可換
變化點子類實現步驟策略類實現整個算法
擴展性增加子類增加策略類,Context 無需修改

經典例子:泡咖啡與泡茶

class CaffeineBeverage {
public:
    void prepareRecipe() { // 模板方法,非虛
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }
    void boilWater() { cout << "把水煮沸" << endl; }
    virtual void brew() = 0; // 純虛,子類必須實現
    void pourInCup() { cout << "倒進杯子" << endl; }
    virtual void addCondiments() = 0;
};

class Coffee : public CaffeineBeverage {
public:
    void brew() override { cout << "用沸水沖泡咖啡" << endl; }
    void addCondiments() override { cout << "加糖和牛奶" << endl; }
};

class Tea : public CaffeineBeverage {
public:
    void brew() override { cout << "用沸水浸泡茶葉" << endl; }
    void addCondiments() override { cout << "加檸檬" << endl; }
};

Hook 方法示例

在基類中加入 virtual void hook() {},子類可選擇覆蓋。模板方法中調用 hook(),實現可選步驟(如「是否加調料」確認)。

適用場景

  • 多個子類共享相同算法結構,僅部分步驟不同。
  • 需控制子類擴展點,避免破壞整體流程。
  • 代碼復用:將公共代碼上移至基類。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved