模板方法模式
模式定义
- 定义一个操作中的算法的骨架,将算法的实现步骤延迟到子类中。模板方法使得一个子类可以不改变一个算法的结构即可重定义该算法的特定步骤
UML 类图
使用场景
- 当我们要完成在某一个细节层次一致的过程或者一系列步骤时,但个别步骤在更详细的层次上的实现可能不同时,通常可以考虑使用模板方法处理
- 重复代码在父类中实现,通过继承的方式让子类调用
优缺点
优点
- 将不变的行为搬移到父类,去除父类的重复代码来体现它的优势
- 提供一个很好的代码复用的平台
- 当不变的和可变的行为在方法的子类实现中混用在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬迁到单一的地方,帮助子类摆脱重复的不变行为的纠缠。
缺点
- 由于模板方法中的算法细节在子类中实现,所以子类的行为影响了父类。在复杂的项目中,会导致代码阅读困难
源码实现
/**
* 模板方法模式:将通用算法封装到抽象基类中,并将不同的算法细节放到子类中。
*/
#include<iostream>
#include<cstdio>
using namespace std;
class AbstractClass
{
public:
~AbstractClass(){}
void templateMethod(){
this->primitiveOperation1();
this->primitiveOperation2();
}
virtual void primitiveOperation1() = 0;
virtual void primitiveOperation2() = 0;
protected:
AbstractClass(){}
};
class ConcreteClassA : public AbstractClass
{
private:
/* data */
public:
ConcreteClassA(/* args */){}
~ConcreteClassA(){}
virtual void primitiveOperation1(){
cout << "ConcreteClassA " << __func__ << endl;
}
virtual void primitiveOperation2(){
cout << "ConcreteClassA " << __func__ << endl;
}
};
class ConcreteClassB : public AbstractClass
{
private:
/* data */
public:
ConcreteClassB(/* args */){}
~ConcreteClassB(){}
virtual void primitiveOperation1(){
cout << "ConcreteClassB " << __func__ << endl;
}
virtual void primitiveOperation2(){
cout << "ConcreteClassB " << __func__ << endl;
}
};
int main(){
AbstractClass *pAbstract = new ConcreteClassA();
pAbstract->templateMethod();
pAbstract = new ConcreteClassB();
pAbstract->templateMethod();
return 0;
}