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

TemplateMethod() 封裝演算法流程,宣告抽象 PrimitiveOperation1/2() 供子類實作。#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
#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";
}
#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()。