文章中部分内容和思路来自《Head First设计模式》
模式定义
在一个方法中定义一个方法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模式类图
典型案例
1.需求说明
客户去银行办理业务的基本流程一致,都是先取号排队,然后在柜台办理相关业务,最后给出评价。其中不同客户办理的业务可能不同,我们放到子类中去实现
2.代码实现
-------------
BankOpera.h
-------------
#ifndef BANKOPERA_H
#define BANKOPERA_H
class BankOpera
{
public:
BankOpera();
public:
void transact();
protected:
void getTrack(); // 取号
virtual void bussiness(); // 办理业务
void comment(); // 评价
};
#endif // BANKOPERA_H
-------------
BankOpera.cpp
-------------
#include "BankOpera.h"
#include <QDebug>
BankOpera::BankOpera()
{
}
void BankOpera::transact()
{
getTrack();
bussiness();
comment();
}
void BankOpera::getTrack()
{
qDebug() << "取号";
}
void BankOpera::bussiness()
{
}
void BankOpera::comment()
{
qDebug() << "评分";
}
------------------
MoneyInBankOpera.h
------------------
#ifndef MONEYINBANKOPERA_H
#define MONEYINBANKOPERA_H
#include "BankOpera.h"
class MoneyInBankOpera : public BankOpera
{
public:
MoneyInBankOpera();
protected:
virtual void bussiness(); // 办理业务
};
#endif // MONEYINBANKOPERA_H
---------------------
MoneyInBankOpera.cpp
---------------------
#include "MoneyInBankOpera.h"
#include <QDebug>
MoneyInBankOpera::MoneyInBankOpera()
{
}
void MoneyInBankOpera::bussiness()
{
qDebug() << "取钱";
}
--------------------
NewAcountBankOpera.h
--------------------
#ifndef NEWACOUNTBANKOPERA_H
#define NEWACOUNTBANKOPERA_H
#include "BankOpera.h"
class NewAcountBankOpera : public BankOpera
{
public:
NewAcountBankOpera();
protected:
virtual void bussiness(); // 办理业务
};
#endif // NEWACOUNTBANKOPERA_H
----------------------
NewAcountBankOpera.cpp
----------------------
#include "NewAcountBankOpera.h"
#include <QDebug>
NewAcountBankOpera::NewAcountBankOpera()
{
}
void NewAcountBankOpera::bussiness()
{
qDebug() << "开户";
}
---------
main.cpp
---------
/**
* 设计模式-模板方法模式
* 要点:1,算法骨架 2,具体方法
*/
#include <QCoreApplication>
#include "MoneyInBankOpera.h"
#include "NewAcountBankOpera.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
BankOpera *ope = new MoneyInBankOpera;
ope->transact();
delete ope;
ope = new NewAcountBankOpera;
ope->transact();
return a.exec();
}
《Head First》中举了一个冲咖啡和冲茶的案例,大同小异,有兴趣可以自己去看下