模板方法模式(Template Method Pattern) 是一种 行为型设计模式,用于定义 算法的骨架,并允许子类在不改变算法结构的情况下 重新定义 其中的某些步骤。
核心思想:
- 在 基类 中定义 算法的整体流程(骨架),但具体的实现留给 子类。
- 基类 只负责调用流程,具体逻辑由 子类 来实现,符合 “开放封闭原则”(对扩展开放,对修改封闭)。
1. 结构
类图
+----------------------+
| AbstractClass | (抽象类)
+----------------------+
| + templateMethod() | (定义算法的骨架)
| + step1() | (基本方法,可能有默认实现)
| + step2() | (抽象方法,交由子类实现)
+----------------------+▲│
+----------------------+
| ConcreteClass | (具体子类)
+----------------------+
| + step2() | (实现父类的抽象方法)
+----------------------+
代码示例
#include <iostream>// 抽象类,定义算法骨架
class AbstractClass {
public:// Template Method,定义算法的框架void templateMethod() {step1(); // 固定实现step2(); // 交给子类实现step3(); // 固定实现}protected:void step1() { // 提供默认实现std::cout << "Step 1: 基类的实现" << std::endl;}virtual void step2() = 0; // 纯虚函数,子类必须实现void step3() { // 提供默认实现std::cout << "Step 3: 基类的实现" << std::endl;}
};// 具体子类,实现 step2
class ConcreteClass : public AbstractClass {
protected:void step2() override {std::cout << "Step 2: 子类的实现" << std::endl;}
};int main() {ConcreteClass obj;obj.templateMethod(); // 调用模板方法return 0;
}
2. 关键点
templateMethod()
在 基类 中定义算法的结构,并且不允许子类重写。- 部分方法(
step1
、step3
) 在基类中有默认实现,子类可以直接继承。 - 部分方法(
step2
) 是virtual
(纯虚函数),子类必须实现自己的逻辑。
3. 适用场景
场景 | 原因 |
---|---|
多个类的算法流程相同,但部分步骤不同 | 避免重复代码,提高复用性 |
算法的某些步骤可能会变化,但主流程不变 | 通过子类扩展,而不影响基类 |
需要控制子类扩展的范围 | 只允许子类修改某些特定步骤 |