欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

模板方法模式:C++实现

程序员文章站 2024-02-07 16:46:58
...

模板方法模式的主要思想:

在一个方法中定义一个算法的骨架,将一些步骤延伸子类中,子类在不改变算法结构的基础上,重新定义算法中的某些步骤。

  • 当子类中必须使用算法中的某个方法或者步骤的实现时,就是用纯虚函数,要求继承基类的子类必须覆盖该方法;
  • 当算法的某个部分是可选时,就使用“钩子”,子类可选择是否实现钩子,但并不像纯虚函数那样必须覆盖,因此,钩子使用虚函数实现,可在基类中提供默认的实现。

下面是使用模板方法设计模式实现的代码,里面包括了钩子的使用:

基类CaffeineBeverage的定义:

CaffeineBeverage.h文件:

#pragma once
#include "stdafx.h"
#include <iostream>
using namespace std;
//定义咖啡因基类
class CaffeineBeverage
{
public:
	void prepareRecipe()
	{
		boilWater();
		brew();
		pourInCup();
		if(customerWantCondiments())
			addCondiments();
	}

	void boilWater()
	{
		cout << "Boiling water" << endl;
	}

	void pourInCup()                         //不加virtual,视为提供默认实现,不会调用子类的方法
		                                     //子类公有的方法提供默认的实现
	{
		cout << "Pouring into cup" << endl; 
	}

	virtual bool customerWantCondiments() { //使用虚函数的多态机制,不同子类不同的实现方式
		return true;                        
	}
	virtual void brew() = 0;               //纯虚函数,提供了子类的通用接口,子类必须实现该接口
	virtual void addCondiments() = 0;
};
子类Tea的定义:

Tea.h文件:

#pragma once
#include "stdafx.h"
#include "CaffeineBeverage.h"
#include <iostream>
using namespace std;
//定义茶类
class Tea : public CaffeineBeverage
{
public:
	void brew()
	{
		cout << "Steeping the tea" << endl;
	}
	void addCondiments()
	{
		cout << "Adding Lemon" << endl;
	}
	bool customerWantCondiments() {
		string answer = getUserInput();
		if (answer[0] == 'y')
			return true;
		else
			return false;
	}
	string getUserInput() {
		string answer = "";
		cout << "Would you like lemon with your tea(y/n)" << endl;
		getline(cin, answer);
		if (answer == "")
			return "no";
		return answer;
	}
};

子类Coffee的定义:

#pragma once
#include "stdafx.h"
#include "CaffeineBeverage.h"
#include <iostream>
#include <string>
using namespace std;
//定义咖啡类
class Coffee : public CaffeineBeverage
{
public:
	void brew()
	{
		cout << "Dripping Coffee through filter" << endl;
	}
	void addCondiments()
	{
		cout << "Adding Sugar and Milk" << endl;
	}
	bool customerWantCondiments() {                   //实现钩子,通过钩子的判断,在不同的子类中实现不同的调用逻辑
		string answer = getUserInput();
		if (answer[0] == 'y')
			return true;
		else
			return false;
	}
	string getUserInput() {
		string answer = "";
		cout << "Would you like milk and sugar with your coffee(y/n)" << endl;
		getline(cin,answer);
		if (answer == "")
			return "no";
		return answer;
	}
};

客户端程序:

#include "stdafx.h"
#include <iostream>
using namespace std;
#include "Coffee.h"
#include "Tea.h"


//客户代码
int main()
{
	Coffee coffee;
	cout << "Making coffee..." << endl;
	coffee.prepareRecipe();
	cout << endl << endl;
	Tea tea;
	cout << "Make tea..." << endl;
	tea.prepareRecipe();
	return 0;
}

程序的运行结果如下:

模板方法模式:C++实现