您的位置:首页 > 编程语言 > C语言/C++

行为模式之模板方法模式(Template Pattern)C++实现

2012-07-02 13:41 736 查看
定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法模式的类图:



钩子:是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。
为了防止子类改变模板方法中的算法,可以将模板方法声明为final。
策略模式:封装可互换的行为,然后使用委托来决定要采用哪一个行为。Strategy模式是将逻辑(算法)封装到一个类中,并采取组合(委托)的方式。

模板方法:子类决定如何实现算法中的某些步骤。将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节。

工厂方法:由子类决定实例化哪个具体的类。

HeadFirst中泡咖啡和泡茶的实现,两种茶的泡法是一样,只是它们的一些步骤需要不同的实现。它们的泡法如下:
1.把水煮沸 2.冲泡 3.把饮料倒进杯子 4.加调料

对于咖啡和茶:步骤2和步骤4依赖饮料的不同具有不同的实现,需要放入子类去实现,而第1和3步相同。
可以使用钩子是来判断是否想要调料。
C++实现如下:
Template.h头文件
#ifndef _TEMPLATE_H_
#define _TEMPLATE_H_

class CaffeineBeverage
{
public:
virtual ~CaffeineBeverage();
void prepareRecipe(); //模板方法,子类不能覆盖
//共同的方法
void boilWater();
void pourInCup();
virtual bool customerWantsCondiments();//钩子,提供空的实现或缺省的实现
protected:
CaffeineBeverage();
//以下两个方法需要在子类实现
virtual void brew()=0;
virtual void addCondiments()=0;

};

class Tea:public CaffeineBeverage
{
public:
Tea();
~Tea();
protected:
void brew();
void addCondiments();
};
class Coffee:public CaffeineBeverage
{
public:
Coffee();
~Coffee();
protected:
void brew();
void addCondiments();
bool customerWantsCondiments();
};

#endif


Template.CPP源文件
#include"Template.h"
#include<iostream>
#include<string>
using namespace std;
CaffeineBeverage::CaffeineBeverage()
{

}
CaffeineBeverage::~CaffeineBeverage()
{

}
/*一个算法的模板,用来制作饮料的,在这个模板中,
算法内的每一个步骤都被一个方法代表了,某些方法是由子类处理的*/

void CaffeineBeverage::prepareRecipe()
{
boilWater();
brew();//由子类处理
pourInCup();
if(customerWantsCondiments())
addCondiments();//由子类处理
}
void CaffeineBeverage::boilWater()
{
cout<<"Boiling Water..."<<endl;
}
void CaffeineBeverage::pourInCup()
{
cout<<"Pouring into cup..."<<endl;
}
/*这是一个钩子,子类可以覆盖这个方法,但可以不这么做*/
bool CaffeineBeverage::customerWantsCondiments()
{
return true;
}

Tea::Tea()
{
}
Tea::~Tea()
{
}
void Tea::brew()
{
cout<<"Steeping the tea..."<<endl;
}
void Tea::addCondiments()
{
cout<<"Adding Lemon..."<<endl;
}

Coffee::Coffee()
{

}
Coffee::~Coffee()
{
}
void Coffee::brew()
{
cout<<"Dripping Coffee through filter..."<<endl;
}
void Coffee::addCondiments()
{
cout<<"Adding Sugar and Milk..."<<endl;
}
bool Coffee::customerWantsCondiments()
{
string answer="";
cout<<"Would you like milk and sugar with your coffee (yes/no)?"<<endl;
cin>>answer;
if(answer=="yes")
return true;
else if("no"==answer)
return false;
else false;

}


主函数:main.CPP
#include "Template.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
CaffeineBeverage *tea=new Tea();
CaffeineBeverage *coffee=new Coffee();

cout<<"Making tea..."<<endl;
tea->prepareRecipe();

cout<<"Making coffee..."<<endl;
coffee->prepareRecipe();

return 0;
}


复制搜索

复制搜索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: