定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
实现方案:将算法/逻辑框架放在抽象基类中,并定义好实现接口,在子类中实现细节接口。
注:策略模式,解决的是相同的问题,只是其方案是将各个接口封装为类,通过委托/组合方式解决问题
使用场景
多个子类有共有的方法,并且逻辑相同/逻辑相同,细节有差异
对重要,复杂的算法,可以讲核心算法设计为模板方法,周边细节由子类实现
重构时,经常使用的方案,将相同的代码抽象到父类,通过钩子函数约束行为。
#include <iostream>
using namespace std;
class AbstractClass
{
public:
virtual void DoA() = 0;
virtual void DoB() = 0;
virtual void Doc() = 0;
void run()
{
DoA();
DoB();
Doc();
}
};
class ConcreteClass1 : public AbstractClass
{
public:
void DoA() { cout << "ConcreteClass1 DoA" << endl; }
void DoB() { cout << "ConcreteClass1 DoB" << endl; }
void Doc() { cout << "ConcreteClass1 DoC" << endl; }
};
class ConcreteClass2 : public AbstractClass
{
public:
void DoA() { cout << "ConcreteClass2 DoA" << endl; }
void DoB() { cout << "ConcreteClass2 DoB" << endl; }
void Doc() { cout << "ConcreteClass2 DoC" << endl; }
};
int main()
{
AbstractClass * r1 = new ConcreteClass1();
r1->run();
delete r1;
AbstractClass * r2 = new ConcreteClass2();
r2->run();
delete r2;
}