模式定义:

模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够在不改变算法结构的情况下,又一次定义算法中的某些步骤。

模板就是一个方法。更详细的说。这种方法将算法定义成一组步骤。当中的不论什么步骤都能够是抽象的,由子类实现。

这能够确保算法的结果保持不变,同一时候由子类提供部分实现。

模式结构:

举例:

泡咖啡和泡茶步骤与基本同样,定义咖啡和茶的类例如以下:

class Coffee
{
public:
void prepareRecipe()
{
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
} void boilWater()
{
cout << "Boiling water" << endl;
} void brewCoffeeGrinds()
{
cout << "Dripping Coffee through filter" << endl;
} void pourCup()
{
cout << "Pouring into cup" <<endl;
} void addSugarAndMilk()
{
cout << "Adding Sugar and Milk" << endl;
}
}; class Tea
{
public:
void prepareRecipe()
{
boilWater();
brewReaBag();
pourInCup();
addLemon();
} void boilWater()
{
cout << "Boiling water" << endl;
} void brewReaBag()
{
cout << "Steeping the tea" << endl;
} void pourCup()
{
cout << "Pouring into cup" <<endl;
} void addLemon()
{
cout << "Adding Lemon" << endl;
}
};

可见有两份冲泡算法中都採用了把水煮沸和把饮料倒入杯子的算法,所以能够把他们放到Coffee和Tea的基类(新定义一个咖啡因类CaffeineBeverage.)中。

还有两个算法并没有被放入基类,但能够将他们定义新的方法名称brew()和addCondiments()方法,并在子类中实现。

UML设计:

编程实现及运行结果:

#include <iostream>

using namespace std;

//定义咖啡因基类
class CaffeineBeverage
{
public:
void prepareRecipe()
{
boilWater();
brew();
pourInCup();
addCondiments();
} void boilWater()
{
cout << "Boiling water" << endl;
} void pourInCup()
{
cout << "Pouring into cup" <<endl;
} virtual void brew(){} virtual void addCondiments(){}
};
//定义咖啡类
class Coffee : public CaffeineBeverage
{
public:
void brew()
{
cout << "Dripping Coffee through filter" << endl;
} void addCondiments()
{
cout << "Adding Sugar and Milk" << endl;
}
};
//定义茶类
class Tea : public CaffeineBeverage
{
public:
void brew()
{
cout << "Steeping the tea" << endl;
} void addCondiments()
{
cout << "Adding Lemon" << endl;
}
};
//客户代码
int main()
{
Coffee coffee;
cout << "Making coffee..." << endl;
coffee.prepareRecipe();
cout << endl << endl; Tea tea;
cout << "Make tea...";
tea.prepareRecipe();
return 0;
}

运行结果例如以下:

Makingcoffee...

Boilingwater

DrippingCoffee through filter

Pouringinto cup

AddingSugar and Milk

 

 

Maketea...Boiling water

Steepingthe tea

Pouringinto cup

AddingLemon

请按随意键继续. . .

设计原则的应用:

好莱坞原则:别调用(打电话)我们,我们会调用你。在好莱坞原则下,我们同意低层组件将自己挂钩到系统上。可是高层组件会决定什么时候和怎么样使用这些低层组件。如在模板方法中:当我们设计模板方法模式时,我们告诉子类。“不要调用我们。我们会调用你”。

设计模式C++实现——模板方法模式的更多相关文章

  1. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

  2. c#设计模式系列:模板方法模式(Template Method Pattern)

    引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格 ...

  3. C#设计模式系列:模板方法模式(Template Method)

    你去银行取款的时候,银行会给你一张取款单,这张取款单就是一个模板,它把公共的内容提取到模板中,只留下部分让用户来填写.在软件系统中,将多个类的共有内容提取到一个模板中的思想便是模板方法模式的思想. 模 ...

  4. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  5. C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...

  6. 设计模式之七:模板方法模式(Template Method)

    模板方法模式: 定义了一个算法的基本操作骨架,并将算法的一些步骤延迟到子类中来实现. 模板方法模式让子类在不更改算法结构的前提下能够又一次定义算法的一些步骤. Define the skeleton ...

  7. 《Java设计模式》之模板方法模式

    模板方法模式是类的行为模式.准备一个抽象类.将部分逻辑以详细方法以及详细构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...

  8. 设计模式之禅——模板方法模式&钩子方法

    ** **板方法模式的定义: 定义一个操作的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的框架即可重定义该算法的某些特定步骤. 例子:做一个简单的悍马车的模型 见UML图 一个抽象 ...

  9. 大话设计模式Python实现-模板方法模式

    模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 下面是一个模 ...

  10. [设计模式] javascript 之 模板方法模式

    模板方法模式说明 定义:定义方法操作的骨架,把一些具体实现延伸到子类中去,使用得具体实现不会影响到骨架的行为步骤! 说明:模式方法模式是一个继承跟复用的典型模式,该模式定义了一个抽象类,Abstrac ...

随机推荐

  1. Linux中使用pwconv实现passwd中密码到shadow

    1.功能说明:开启用户的投影密码. 2.语 法:pwconv 3.个人理解:就是将/etc/passwd里的密码用x代替,并将真实密码(当然是加密后的)转移到/etc/shadow里面. 4.补充说明 ...

  2. hadoop 文件合并

    来自:http://blog.csdn.net/dandingyy/article/details/7490046 众所周知,Hadoop对处理单个大文件比处理多个小文件更有效率,另外单个文件也非常占 ...

  3. JavaWeb项目异常管理之log4j的使用教程

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6399191.html 在项目中的应用见: https://github.com/ygj0930/CoupleS ...

  4. golang 面试

    1) 基础语言描述理解考察https://www.tutorialspoint.com/go/go_interview_questions.htm这里有一栏.全面的问答,并且非常基础也包括golang ...

  5. Echarts柱状图的点击事件

    最近在做一些图表统计的功能,用到了百度的开源图表软件Echatrs,不得不提的是:不但上手简单而且扩展功能也是十分强大.在使用的过程中也遇到了不少问题,可能由于有关Echatrs的资料并不是很齐全,所 ...

  6. Knockout学习之表单绑定器(上)

    表单绑定器 “click”绑定 Click 绑定器可以将javascript函数绑定到指定的dom元素,并且再该元素被点击时将触发绑定的函数,大多数情况下都会使用button.input和a元素,当然 ...

  7. HttpServletResponse对象(一)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  8. [Dubbo实战]dubbo + zookeeper + spring 实战 (转)

    这里最熟悉的就是spring了,项目中应用很多.dubbo是一个实现分布式的框架,zookeeper是注册中心.给我的感觉就像多对多关系的两者表,zookeeper相当于第三张表维护关系.下面通过一个 ...

  9. 转:折腾一晚上Bullet及Ogre相关工具的成果 -- 3Ds Max,Maya, blender, GameKit

    起始目的很简单,整合Bullet及Ogre,找个能够生成.scene和.bullet文件的建模工具. 折腾一晚上Bullet及Ogre相关的东西,基本上就像爱迪生发明灯泡一样,得出了N个失败的教训,总 ...

  10. 今天才明白VC++.net的含义: VS系列的c++编译器可以支持托管C++(类似于C#,具体请看MS在线文档),当然包括winform界面开发。

    因此我决定用winform做界面,用C++写逻辑.当然尽量不用托管代码写逻辑.