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;
}