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

設計模式實作系列(十一):Template Method 模板方法模式 - 定義演算法骨架延遲步驟至子類實作

     編輯:關於C++

模式意圖

定義一個操作中的演算法骨架,將某些步驟延遲到子類中。Template Method 使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

UML 結構圖

Template Method UML

核心解析

  • AbstractClass: 定義 TemplateMethod() 封裝演算法流程,宣告抽象 PrimitiveOperation1/2() 供子類實作。
  • ConcreteClass: 實作具體步驟邏輯。
  • 好萊塢原則: 「別呼叫我們,我們會呼叫你」——父類控制流程,子類填空。
  • 缺點: 骨架固定後難以變更,違反「組合優於繼承」。若流程變化大,改用 Strategy + 組合更彈性。

C++ 完整實作

1. TemplateMethod.h

#ifndef TEMPLATEMETHOD_H
#define TEMPLATEMETHOD_H

class AbstractClass {
public:
    AbstractClass() {}
    virtual ~AbstractClass() {}
    void TemplateMethod(); // 非虛擬,鎖定流程
protected:
    virtual void PrimitiveOperation1() = 0;
    virtual void PrimitiveOperation2() = 0;
};

class ConcreteClass : public AbstractClass {
public:
    ConcreteClass() {}
    virtual ~ConcreteClass() {}
protected:
    virtual void PrimitiveOperation1();
    virtual void PrimitiveOperation2();
};

#endif

2. TemplateMethod.cpp

#include "TemplateMethod.h"
#include <iostream>

void AbstractClass::TemplateMethod() {
    PrimitiveOperation1();
    PrimitiveOperation2();
}
void ConcreteClass::PrimitiveOperation1() {
    std::cout << "PrimitiveOperation1 by ConcreteClass\n";
}
void ConcreteClass::PrimitiveOperation2() {
    std::cout << "PrimitiveOperation2 by ConcreteClass\n";
}

3. Main.cpp

#include "TemplateMethod.h"
#include <cstdlib>

int main() {
    AbstractClass* p = new ConcreteClass;
    p->TemplateMethod();
    delete p;
    return 0;
}

進階技巧:鉤子方法

在基類提供預設實作(可為空)的 Hook() 方法,子類選擇性覆寫,增加流程控制彈性:

class AbstractClass {
    // ...
    virtual void HookBefore() {} // 子類可選覆寫
    virtual void HookAfter() {}
    void TemplateMethod() {
        HookBefore();
        PrimitiveOperation1();
        PrimitiveOperation2();
        HookAfter();
    }
};

適用場景

  • 固定流程、變化步驟(如資料匯入:讀取→驗證→轉換→寫入,驗證/轉換因格式而異)。
  • 框架設計:Application::Run() 定義初始化/主迴圈/清理,衍生類實作具體邏輯。
  • 測試框架 SetUp() → TestBody() → TearDown()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved