算法模式
模板算法模式: 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的基础上,重新定义算法中的某些步骤
类图:
一个简单的例子: 冲泡一杯咖啡和冲泡一杯茶的步骤很相似
- 烧水
- 冲泡
- 倒入杯子
- 加入调料
因此可以将准备的过程在封装在基类中,具体的实现方法,可以由子类实现。
咖啡因类饮料
#include <iostream>
#include <string.h>
using namespace std;
class CoffeineBeverage{
public:
CoffeineBeverage();
virtual ~CoffeineBeverage();
void prepareRecipe();
void boilWater();
virtual void brew() = 0;
void pourInCup();
virtual void addCondiments() = 0;
};
#include "coffeinebeverage.h"
CoffeineBeverage::CoffeineBeverage(){
}
CoffeineBeverage::~CoffeineBeverage(){
}
void CoffeineBeverage::prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
}
void CoffeineBeverage::boilWater(){
cout << "boilWater" << endl;
}
void CoffeineBeverage::pourInCup(){
cout << "pourInCup" << endl;
}
咖啡
#include <iostream>
#include <string.h>
#include "coffeinebeverage.h"
using namespace std;
class Coffee : public CoffeineBeverage{
public:
Coffee();
virtual ~Coffee();
virtual void brew;
virtual void addCondiments();
};
#include "coffee.h"
Coffee::Coffee(){
}
Coffee::~Coffee(){
}
void Coffee::brew(){
cout << "brewCoffeeGrinds" << endl;
}
void Coffee::addCondiments(){
cout << "addSugarAndMilk" << endl;
}
茶
#include <iostream>
#include <string.h>
#include "coffeinebeverage.h"
using namespace std;
class Tea : public CoffeineBeverage{
public:
Tea();
virtual ~Tea();
virtual void brew();
virtual void addCondiments();
};
#include "tea.h"
Tea::Tea(){
}
Tea::~Tea(){
}
void Tea::brew(){
cout << "brewTea" << endl;
}
void Tea::addCondiments(){
cout << "addLemon" << endl;
}
钩子是一种方法 它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要覆盖他,通过钩子子类可以对算法的某些流程进行干预
void CoffeineBeverage::prepareRecipe(){
boilWater();
brew();
pourInCup();
if(isCondiments())
addCondiments();
}
bool CoffeineBeverage::isCondiments(){
return true;
}
好莱坞原则 决策权放在高层模块中,以便决定如何以及何时调底层模块
与策略模式的区别 策略模式和模板方法模式都封装算法,一个用组合,一个用继承。策略模式用委托的方式实现。
与工厂模式 工厂模式是模板方法模式的特殊版本