[C++设计模式]template 模板方法模式
模板法模式:定义一个操作中的算法骨架。而将一些步骤延迟到子类中。
依照《headfirst 设计模式》的样例。煮茶和煮咖啡的算法框架(流程)是一样的。仅仅是有些算法的实现是不一样的,有些是一样的。
我们能够将共同的算法框架封装为一个虚基类,将同样的算法声明为不可覆盖的(static)。不同的算法声明为子类要实现的纯虚函数。
能够使用hook()函数处理算法框架的细小差异。
看到这里,也许会想起策略模式。
策略模式也是将能够改变的算法和不轻易改变的算法差别对待,但策略模式和模板方法模式的最根本差别是:
策略模式是採用类组合,将不变的算法仍保留在原来类中。仅仅是将要重载的算法单独封装为一个虚基类,子类实现自己的版本号,这样原来的类就
能够组合不同的接口子类。调用不同的算法。
模板方法模式是採用类继承,将算法框架(步骤)封装为一个虚基类,并且算法框架是不可覆盖的,子类仅仅能对个别步骤有不同的实现。基类也能够引入hook()函数来对算法框架微调。hook()钩子函数的原理非常easy,基类的hook()函数能够定义为空,也能够定义一些操作,子类能够对基类的hook()函数进行重载。
以下是不带hook()钩子的模板方法模式:
class CaffeineBeverage //咖啡因饮料
{
public:
void PrepareRecipe() //咖啡因饮料冲泡法
{
BoilWater(); //把水煮沸
Brew(); //冲泡
PourInCup(); //把咖啡因饮料倒进杯子
AddCondiments(); //加调料
}
void BoilWater()
{std::cout << "把水煮沸" << std::endl;}
virtual void Brew() = 0;
void PourInCup()
{std::cout << "把咖啡倒进杯子" << std::endl;}
virtual void AddCondiments() = 0;
};
class Coffee : public CaffeineBeverage
{
public:
void Brew()
{std::cout << "用沸水冲泡咖啡" << std::endl;}
void AddCondiments()
{std::cout << "加糖和牛奶" << std::endl;}
};
class Tea : public CaffeineBeverage
{
public:
void Brew()
{std::cout << "用沸水浸泡茶叶" << std::endl;}
void AddCondiments()
{std::cout << "加柠檬" << std::endl;}
};
int main(void)
{
std::cout << "冲杯咖啡:" << std::endl;
Coffee c;
c.PrepareRecipe();
std::cout << std::endl;
std::cout << "冲杯茶:" << std::endl;
Tea t;
t.PrepareRecipe();
return 0;
}
[C++设计模式]template 模板方法模式的更多相关文章
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
		
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
 - Android 设计模式Template Method模式
		
自定义模板方法模式:定义的算法的骨架中的方法,虽然某些步骤推迟到子类中,下模板方法允许子类不能改变在的情况下,该算法的结构.算法重新定义某些步骤. 设计原则:不要给我们打电话.我会打电话给你.(像猎头 ...
 - 折腾Java设计模式之模板方法模式
		
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
 - C++设计模式-TemplateMethod模板方法模式
		
Template模板方法模式作用:定义一个操作中的算法的骨架.而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 其关键是将通用算法(逻辑)封装在抽象基 ...
 - 设计模式 Template Method模式 显示程序猿的一天
		
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 不断设计模式~ Template Method模式 老套路,看高清 ...
 - js设计模式——6.模板方法模式与职责链模式
		
js设计模式——6.模板方法模式与职责链模式 职责链模式
 - Java设计模式之模板方法模式(Template)
		
前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...
 - C#设计模式(14)——模板方法模式(Template Method)
		
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
 - [设计模式] 22 模板方法模式 template
		
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
 
随机推荐
- spring---aop(8)---Spring AOP中optimize
			
写在前面 optimize是ProxyConfig的属性.意思为 是否对生产代理策略使用优化. public class ProxyConfig implements Serializable { p ...
 - PPT文化
			
PPT文化,yes or no? 知识是有体系的,有的时候刚接触的时候可以 推导技术 ,汇报.吹牛都可以应用上,并且可以让别人想想. 但是实际应用技术,就需要涉及很多详细的技术细节,如果少掉一个看似极 ...
 - poj 1279 Art Gallery - 求多边形核的面积
			
/* poj 1279 Art Gallery - 求多边形核的面积 */ #include<stdio.h> #include<math.h> #include <al ...
 - How to exit the entire application from a Python thread?
			
If all your threads except the main ones are daemons, the best approach is generally thread.interrup ...
 - JS实现《黑客帝国》落地字母背景
			
JS实现<黑客帝国>落地字母背景.这个特别有意思,主要是通过设置字符相关属性.控制循环字母距离顶部的高度值,来达到字母不断循环下落的功能. 恩,还有加上一个随机机制,出现各种大小 各个位置 ...
 - Visual Studio 2013 密钥
			
Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥) ...
 - Chrome在win8显示“没有注册类”的解决办法
			
问题1:从任务栏和桌面快捷方式无法打开Chrome,显示错误为没有注册类问题2:无法从word等中点击打开url,无法打开html,htm方式的文件,同样显示错误为没有注册类出了这两个错误后,用起来相 ...
 - Pig系统分析(5)-从Logical Plan到Physical Plan
			
Physical Plan生成过程 优化后的逻辑运行计划被LogToPhyTranslationVisitor处理,生成物理运行计划. 这是一个经典的Vistor设计模式应用场景. 当中,LogToP ...
 - dubbo白名单通过filter,spring web通过拦截器或者filter即可
			
在开发中,有时候需要限制访问的权限,白名单就是一种方法.对于Java Web应用,Spring的拦截器可以拦截Web接口的调用:而对于dubbo接口,Spring的拦截器就不管用了. dubbo提供了 ...
 - pytest文档23-使用多个fixture和fixture直接互相调用
			
使用多个fixture 如果用例需要用到多个fixture的返回数据,fixture也可以return一个元组.list或字典,然后从里面取出对应数据. # test_fixture4.py impo ...