模板方法模式(Template Method Pattern)的定义
(1)定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
(2)模板方法模式的结构和说明
①AbstractClass:抽象类。用于定义算法骨架和抽象的原语操作,具体的子类通过重定义这些原语操作来实现一个算法的各个步骤。在这个类里面,还可以提供算法中通用的实现。此外,该类还实现了一个模板方法,它定义了算法的骨架。该模板方法不仅调用原语操作,也调用AbstractClass或其他对象中的操作。
②ConcreteClass:具体实现类。用来实现算法骨架中的某些步骤,完成与特定子类相关的功能。
【编程实验】在线购物流程
//行为型模式——模板方式模式
//场景:在线购物
/*
网购,天猫或者京东,经历一下四个步骤:
①访问网站 //访问协议和网址不同
②浏览下单 //假设两个网站操作一样
③支付 //天猫:支付宝,东京;货到付款
④收货 //确认操作一样
注意:两个网站第2步和第4步都是一样的,但访问和支付的访问不一样
*/
#include <iostream>
#include <string>
using namespace std;
//抽象模板方法:将相同的方法提升到父类
class CShopOnLine{
protected://专题方法,由子类自己去实现
virtual void AccessUrl() = 0;
virtual void PayMoney() = 0;
private://公共方法
void MakeOrder(){cout << "创建订单成功" << endl;}
void ReceiptGood(){cout << "收到了物品" << endl;}
public:
void GoShopping(){//购物
//访问网站----->浏览下单------->支付-------------->收货
AccessUrl(); MakeOrder(); PayMoney(); ReceiptGood();
}
};
//天猫
class CTmall : public CShopOnLine{
public:
void AccessUrl(){cout << "https://www.tmall.com/" << endl;}
void PayMoney(){cout << "支付宝" << endl;}
};
//京东
class CJD : public CShopOnLine{
public:
void AccessUrl(){cout << "https://www.jd.com/" << endl;}
void PayMoney(){cout << "微信支付/货到付款" << endl;}
};
void main()
{
cout << "欢迎来到天猫商城:" << endl;
CShopOnLine* pTmall = new CTmall();
if(pTmall != NULL){
pTmall->GoShopping();
delete pTmall; pTmall = NULL;
}
cout << endl << "欢迎来到京东商城:" << endl;
CShopOnLine* pJD = new CJD();
if(pJD != NULL){
pJD->GoShopping();
delete pJD; pJD = NULL;
}
}