介绍
Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为模板方法模式是由抽象模板和具体模板构成,抽象模板分为两类
- 基本方法:基本操作,有子类实现的方法,在模板方法中被调用
- 模板方法:可以由一个或多个,是一个具体的方法,也就是一个框架,实现对基本方法的掉队,完成固定的逻辑。为了防止恶意的操作一般模板方法都加上final关键字不允许被覆写
具体模板实现抽象模板,但只覆写基本方法
优点:封装不变部分,扩展可变部分;提取公共部分代码;便于维护、行为由父类控制,子类实现
缺点:抽象类纯虚函数;子类执行的结果影响了父类的结果
Template Method模式-般应用在具有以下条件的应用中:
.具有统一的操作步骤或操作过程。
.具有不同的操作细节。
.存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同。
多个子类有公有的方法,并且逻辑基本相同时;重要、复杂的算法,可以把核心算法设计为模板方法;重构时把相同的代码抽取到父类中。
UML类图:
简单例子:
#ifndef SIMPLE_TEMPLET_H
#define SIMPLE_TEMPLET_H
#include <iostream>
using namespace std;
class AbstractClass
{
public:
void templateMethod()
{
primitiveOperation1();
primitiveOperation2();
cout<<"AbstractClass \n";
}
virtual void primitiveOperation1() = 0;
virtual void primitiveOperation2() = 0;
};
class ConcreteClassA : public AbstractClass
{
public:
void primitiveOperation1()
{
cout<<"具体类 A 方法 1 的实现"<<endl;
}
void primitiveOperation2()
{
cout<<"具体类 A 方法 2 的实现"<<endl;
}
};
class ConcreteClassB : public AbstractClass
{
public:
void primitiveOperation1()
{
cout<<"具体类 B 方法 1 的实现"<<endl;
}
void primitiveOperation2()
{
cout<<"具体类 B 方法 2 的实现"<<endl;
}
};
#endif // SIMPLE_TEMPLET_H
调用:
#include "simple_templet.h"
int main()
{
AbstractClass *ac;
ac = new ConcreteClassA;
ac->templateMethod();
ac = new ConcreteClassB;
ac->templateMethod();
return 0;
}