模板方法模式: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;
}
程序的运行结果如下: