1. 程式人生 > >C++設計模式——模板方法模式

C++設計模式——模板方法模式

1定義
定義一個操作的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

實現方案:將演算法/邏輯框架放在抽象基類中,並定義好實現介面,在子類中實現細節介面。

注:策略模式,解決的是相同的問題,只是其方案是將各個介面封裝為類,通過委託/組合方式解決問題

2類圖

在這裡插入圖片描述

3.實現

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>

using namespace std;

//抽象的製作飲料方法
class MakeDrink
{
public:
	//1 把水煮開
	void boil() {
		cout << "把水煮開" << endl;
	}
	//2 衝某物
	virtual void brew() = 0;
	//3 從大杯倒入小杯
	void putInCup()
	{
		cout << "把沖泡好的飲料 從大杯倒入小杯" << endl;
	}
	//4 加一些酌料
	virtual void addThings() = 0;

	//鉤子函式, hook
	virtual bool CustomWantAddThings() {
		return true;
	}


	//業務的邏輯的統一模板 
	void make() {
		boil();
		brew(); //子類
		putInCup(); 

		if (CustomWantAddThings() == true) {
			addThings(); //子類的多型
		}
	}
};

//製作咖啡
class MakeCoffee :public MakeDrink
{
public:
	MakeCoffee(bool isAdd)
	{
		this->isAdd = isAdd;
	}
	//2 衝某物
	virtual void brew()
	{
		cout << "沖泡咖啡豆" << endl;
	}

	//4 加一些酌料
	virtual void addThings()  {
		cout << "新增糖和牛奶" << endl;
	}

	virtual bool CustomWantAddThings() {
		return isAdd;
	}

private:
	bool isAdd;
};

//沖泡茶葉
class MakeTea :public MakeDrink
{
public:
	MakeTea(bool isAdd)
	{
		this->isAdd = isAdd;
	}

	//2 衝某物
	virtual void brew() {
		cout << "沖泡 茶葉" << endl;
	}
	//4 加一些酌料
	virtual void addThings()  {
		cout << "新增 檸檬 或者 菊花" << endl;
	}

	virtual bool CustomWantAddThings() {
		return isAdd;
	}

private:
	bool isAdd;
};

int main(void)
{
	MakeDrink *makeCoffee = new MakeCoffee(true);
	makeCoffee->make();

	cout << " ------ " << endl;

	MakeDrink *makeTea = new MakeTea(false);
	makeTea->make();
	
	return 0;
}