Behavior.TemplateMethod模板方法模式:共同方法提升至父類

騎在木馬上的黑客發表於2018-04-23
模板方法模式(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;
	}
}


相關文章