生活需求:去银行办理业务经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。
模板方法:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
优势:
缺点:
主要角色:
(1)抽象父类:
(2)具体子类:实现抽象类中所定义的抽象方法和钩子方法。
具体案例:
小码路最近买彩彩票中了30万,随机存入银行,朋友知道后,借了20万,真是树大招风呀,于是小码路给朋友转过去了,朋友屁颠屁颠取走了20万!故事纯属虚构哈,我也想天上掉馅饼哦。就靠小伙伴们了哈!
第一步:抽象父类
#pragma once
#include <iostream>
using namespace std;
class Bank
{
public:
void QuHao()
{
cout<<"请前排取号"<<endl;
}
void PingJia()
{
cout<<"请对本次服务进行评价"<<endl;
}
virtual void CaoZuo()=0;
void Process()
{
this->QuHao();
this->CaoZuo();
this->PingJia();
}
};
第二步:具体子类
//因人而异
class Deposit:public Bank
{
public:
void CaoZuo()
{
cout<<"小码路存入银行30万!"<<endl;
}
};
class Transfer:public Bank
{
public:
void CaoZuo()
{
cout<<"小码路向朋友转账20万!"<<endl;
}
};
class Withdraw:public Bank
{
public:
void CaoZuo()
{
cout<<"小码路的朋友取走20万!"<<endl;
}
};
第三步:客户端
#include "bank.h"
int main()
{
Bank *bank=new Deposit();
bank->Process();
delete bank;
Bank *bank1=new Transfer();
bank1->Process();
delete bank1;
Bank *bank2=new Withdraw();
bank2->Process();
delete bank2;
return 0;
}
结果显示: