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

定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法模式的类图:


钩子:是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。

  模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。

 模板方法的抽象类可以定义具体方法、抽象方法和钩子。

抽象方法由子类实现。

钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。

为了防止子类改变模板方法中的算法,可以将模板方法声明为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;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值