1.1 基本概念
模板方法模式(Template Method Pattern),定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
1.2 模式结构
AbstractClass:抽象类
在抽象类中定义一系列基本操作,这些基本操作可以是具体的,也可以是抽象的,每一个步骤,在其子类中可以重复定义并实现一个算法的各个步骤。
ConcreteClass:具体子类
具体子类是抽象类的子类,用于实现在父类中定义的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中实现的具体基本操作。
1.3 优缺点
优点:
(1)模板方法模式可以在子类中定义详细的处理算法时不会改变算法的结构;
(2)是一种类库技术,提取累的公共行为,将公共行为放在父类中,而通过其子类可以实现不同的行为;
(3)提供了一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展而增加新行为。
缺点:
每个不同的实现都需要定义一个子类,会导致子类数量的增加。
1.4 应用
(1)一次性实现一个算法的不变部分,并将可变行为留给子类来实现;
1.5 举例
#include<iostream>
using namespace std;
class BankTemplateMethod //银行办理业务
{
public:
void takeNumber(){ //取号
cout << "take a number" << endl;
}
virtual void transact() = 0;//办理业务
void evaluate()//反馈评分
{
cout << "Feedback rating" << endl;
}
void process()//办理业务
{
takeNumber();
transact();
evaluate();
}
};
class Deposit:public BankTemplateMethod//存款类
{
virtual void transact()//存款
{
cout << "take deposits service" <<endl;
}
};
class Withdrawal:public BankTemplateMethod//取款类
{
virtual void transact()//取款
{
cout << "handle withdrawal service" <<endl;
}
};
class Transfer:public BankTemplateMethod//转账类
{
virtual void transact()//转账
{
cout << "handle transfer service" <<endl;
}
};
int main()
{
BankTemplateMethod* bankTemplateMethod= new Deposit();
bankTemplateMethod->process();
bankTemplateMethod= new Withdrawal();
bankTemplateMethod->process();
bankTemplateMethod= new Transfer();
bankTemplateMethod->process();
delete bankTemplateMethod;
return 0;
}
运行结果:
take a number
take deposits service
Feedback rating
take a number
handle withdrawal service
Feedback rating
take a number
handle transfer service
Feedback rating