模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到之类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
应用分析
模板方法定义了一个算法的步骤(模板),并允许子类为一个或多个步骤提供实现。
模板方法模式的抽象基类提供三类方法:
1.模板方法,用于定义算法步骤,不应再子类中改变;
2.抽象方法,提供一个接口,用于在子类中实现;
3.具体方法,由抽象类具体实现,具有不变性;
4.钩子方法,这个方法有缺省的实现,允许子类覆盖它,可以用来改变算法。
实例分析
茶和咖啡的冲泡方式非常相似,但也有不同,要是分别实现,会造成代码重复,我们对其冲泡过程进行抽象,采用模板方法模式。
代码分析
//Template.h
//模板接口和接口实现
#ifndef TEMPLATE_H
#define TEMPLATE_H
#include <iostream>
class CaffeineBeverage//模板抽象类
{
public:
void prepare()//不允许子类改变的方法
{
boilWater();
brew();
pourInCup();
if(customerWantsCondiments()) addCondiments();
}
void boilWater()
{
std::cout<<"Boiling water"<<std::endl;
}
virtual void brew()=0;//由子类实现的方法
void pourInCup()
{
std::cout<<"Pouring into cup"<<std::endl;
}
virtual void addCondiments()=0;
virtual bool customerWantsCondiments()//钩子方法,子类可以实现,可以不实现
{
return true;
}
};
class Coffee:public CaffeineBeverage//咖啡类
{
public:
void brew()
{
std::cout<<"Coffee brew"<<std::endl;
}
void addCondiments()
{
std::cout<<"Coffee addCondiments"<<std::endl;
}
bool customerWantsCondiments()//实现钩子方法
{
char ans=useInput();
if(ans=='Y') return true;
else return false;
}
char useInput()
{
char ans;
std::cout<<"Would you like milk and sugar with your coffee (Y/N)? ";
std::cin>>ans;
return ans;
}
};
class Tea:public CaffeineBeverage//茶类
{
public:
void brew()
{
std::cout<<"Tea brew"<<std::endl;
}
void addCondiments()
{
std::cout<<"Tea addCondiments"<<std::endl;
}
//不实现钩子方法
};
#endif
//Main.cpp
//测试程序
#include "Template.h"
int main()
{
Coffee c;
c.prepare();
Tea t;
t.prepare();
return 0;
}