模板方法模式的主要思想:
在一个方法中定义一个算法的骨架,将一些步骤延伸子类中,子类在不改变算法结构的基础上,重新定义算法中的某些步骤。
- 当子类中必须使用算法中的某个方法或者步骤的实现时,就是用纯虚函数,要求继承基类的子类必须覆盖该方法;
- 当算法的某个部分是可选时,就使用“钩子”,子类可选择是否实现钩子,但并不像纯虚函数那样必须覆盖,因此,钩子使用虚函数实现,可在基类中提供默认的实现。
下面是使用模板方法设计模式实现的代码,里面包括了钩子的使用:
基类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 << "Pour