1. 意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2. 两种角色
抽象类(Abstract Class)、具体类(Concrete Class)
3. 优点
3.1 一种代码复用的基本技术。提取公共行为,父类调用子类操作。
4. 缺点
N/A
5. 相关模式
5.1 工厂方法模式常被模板方法调用。
工厂方法是延迟到子类创建对象,模板方法是延迟到子类改变部分算法(行为)。
5.2 策略模式是改变整个算法,而模板方法是改变算法的一部分。
6. 代码示意(C++)
#pragma once
#include <iostream>
using namespace std;
class AbstractClass
{
public:
void TemplateMethod() {
Start();
Operation1();
Operation2();
End();
}
protected:
void Start() {
cout << "Start in TemplateMethod" << endl;
}
void End() {
cout << "End in TemplateMethod" << endl;
}
protected:
virtual void Operation1() {
cout << "Operation1 in AbstractClass" << endl;
}
virtual void Operation2() {
cout << "Operation2 in AbstractClass" << endl;
}
};
class ConcreteClass : public AbstractClass
{
protected:
virtual void Operation1() {
cout << "Operation1 in ConcreteClass" << endl;
}
virtual void Operation2() {
cout << "Operation2 in ConcreteClass" << endl;
}
};
#include "TemplateMethod.h"
int main() {
AbstractClass* pClass = new ConcreteClass();
pClass->TemplateMethod();
delete pClass;
return 0;
}
运行结果:
6.1 AbstractClass::TemplateMethod定义了操作框架(步骤)。
6.2 ConcreteClass可以改变中间的两个步骤Operation1、Operation2。