行为模式之模板方法模式(Template Pattern)C++实现
2012-07-02 13:41
736 查看
定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法模式的类图:
钩子:是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。
为了防止子类改变模板方法中的算法,可以将模板方法声明为final。
策略模式:封装可互换的行为,然后使用委托来决定要采用哪一个行为。Strategy模式是将逻辑(算法)封装到一个类中,并采取组合(委托)的方式。
模板方法:子类决定如何实现算法中的某些步骤。将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节。
工厂方法:由子类决定实例化哪个具体的类。
HeadFirst中泡咖啡和泡茶的实现,两种茶的泡法是一样,只是它们的一些步骤需要不同的实现。它们的泡法如下:
1.把水煮沸 2.冲泡 3.把饮料倒进杯子 4.加调料
对于咖啡和茶:步骤2和步骤4依赖饮料的不同具有不同的实现,需要放入子类去实现,而第1和3步相同。
可以使用钩子是来判断是否想要调料。
C++实现如下:
Template.h头文件
Template.CPP源文件
主函数:main.CPP
复制搜索
复制搜索
模板方法模式的类图:
钩子:是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。
为了防止子类改变模板方法中的算法,可以将模板方法声明为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; }
复制搜索
复制搜索
相关文章推荐
- 我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)
- (C++实现)——模板方法模式(Template Method Pattern)
- C++设计模式十--TemplatePattern(模板方法模式)
- 我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)
- 我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)
- First head 设计模式学习c++实现------模板方法模式(Template method pattern)
- 模板方法模式(Template Method Pattern)-c++实现
- 设计模式之模板方法模式,C++实现
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
- c++设计模式:模板方法模式(Template Method Pattern)
- 模板方法模式——Template Method Pattern
- 设计模式C++实现(5)——原型模式、模板方法模式
- 您的设计模式——模板方法模式【Template Method Pattern】
- 模板方法模式(Template Pattern)
- 设计模式19:Template Method Pattern (模板方法模式)
- 设计模式 - Template Method Pattern(模板方法模式)
- Java设计模式(16)——行为模式之模板方法模式(Template)
- 模板方法模式(Template Method Pattern)
- Java设计模式--模板方法模式【Template Pattern】
- 设计模式——模板方法模式(Template Pattern)