模板方法模式是一種行為設計模式,它通過定義一個算法的骨架,而將一些步驟延遲到子類中實現。Template Method 使得子類可以不改變(復用)一個算法結構 即可重定義(override 重寫)該算法的某些特定步驟。
基本結構
// 抽象類定義模板方法和基本操作
class AbstractClass {
public:// 模板方法,定義算法骨架(通常聲明為final防止子類覆蓋)void templateMethod() const {this->baseOperation1();this->requiredOperation1();this->baseOperation2();this->requiredOperation2();}// 基類中已實現的操作void baseOperation1() const {std::cout << "AbstractClass: 執行基礎操作1\n";}void baseOperation2() const {std::cout << "AbstractClass: 執行基礎操作2\n";}// 需要子類實現的純虛函數virtual void requiredOperation1() const = 0;virtual void requiredOperation2() const = 0;// 虛析構函數virtual ~AbstractClass() = default;
};
開發人員只需繼承AbstractClass? 重寫其中的虛函數然后調用templateMethod()即可
/ 具體實現類1
class ConcreteClass1 : public AbstractClass {
public:void requiredOperation1() const override {std::cout << "ConcreteClass1: 實現操作1\n";}void requiredOperation2() const override {std::cout << "ConcreteClass1: 實現操作2\n";}
};// 具體實現類2(帶鉤子方法覆蓋)
class ConcreteClass2 : public AbstractClass {
public:void requiredOperation1() const override {std::cout << "ConcreteClass2: 實現操作1\n";}void requiredOperation2() const override {std::cout << "ConcreteClass2: 實現操作2\n";}void hook() const override {std::cout << "ConcreteClass2: 覆蓋鉤子方法\n";}
};
具體調用
int main() {std::cout << "同一客戶端代碼可以處理不同子類:\n";AbstractClass *concreteClass1 = new ConcreteClass1();concreteClass1->templateMethod();std::cout << "\n同一客戶端代碼可以處理不同子類:\n";AbstractClass *concreteClass2 = new ConcreteClass2();concreteClass2->templateMethod();return 0;
}
uml圖
應用場景
框架設計:定義框架的流程,允許用戶自定義特定步驟
算法骨架固定:當多個類有相似算法但實現細節不同時
代碼復用:將公共行為提取到父類中
控制子類擴展:限制子類只能修改算法的特定部分
優點
提高代碼復用性,避免重復代碼
良好的擴展性,符合開閉原則
便于維護,算法修改只需在父類中進行
反向控制結構,父類控制整體流程
缺點
每個不同的實現都需要一個子類,可能導致類數量增加
通過繼承實現,可能違反組合優于繼承的原則
父類與子類之間緊密耦合
實際應用示例
STL中的分配器(allocator):定義內存分配算法框架
GUI框架:如窗口顯示流程固定,具體繪制由子類實現
單元測試框架:定義測試流程(setUp, test, tearDown)
編譯器設計:編譯流程固定,具體語法分析等步驟可變