模板方法模式:定義一個操作中的算法骨架,將某些步驟延遲到子類中實現。基類封裝不變的流程,子類實現變化的細節。
templateMethod()(final/非虛),調用基本操作 primitiveOperation1()、primitiveOperation2() 等。基本操作聲明為純虛函數或虛函數。| 維度 | 模板方法模式 | 策略模式 |
|---|---|---|
| 關係 | 繼承 | 組合 |
| 算法骨架 | 基類固定,不可覆蓋 | 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; }
};
在基類中加入 virtual void hook() {},子類可選擇覆蓋。模板方法中調用 hook(),實現可選步驟(如「是否加調料」確認)。