模式定义:

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

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

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

模式结构:

举例:

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

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. Xcode missing file or .png is missing from working copy

    当不小心在工程文件中删掉文件时.有可能会提示 .xxx   is missing from working copy 有可能是SVN引起的.删掉这个文件就好了 如果是单个文件.进入Terminal 相 ...

  2. C/C++中的值传递,引用传递,指针传递,指针引用传递

    在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘. 1. 值传递 void f( int p){ printf(& ...

  3. 将/home空间从新挂载到/var/lib/docker

    [lxl@node1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 49G 34G 15G ...

  4. Selenium2(WebDriver)总结(二)---Firefox的firebug插件参数设置(补充)

    本文是对上一节的补充:http://www.cnblogs.com/puresoul/p/4251536.html 使用Selenium2(webdriver)启动firefox且自动加载firebu ...

  5. 第八周(2) Word邮件合并1

    源自:http://www.sxszjzx.com/~c20/12-2/office-gj/files/8-2/8-2.html 第八周(2) Word邮件合并1 教学时间 2013-4-16 教学课 ...

  6. C#通过代码调用PowerShell

    var userId = "MyAccount@XXXXX.partner.onmschina.cn"; var tenantId = "XXXXX-ca13-4bcb- ...

  7. Java 通过 jacob调用OCX控件

    安装好要调用的ocx驱动,并通过注册表查询其对应的clsid. 下载jacob-1.18解压,将jacob-1.18-x86.dll文件复制到D:\Program Files (x86)\Java\j ...

  8. spring boot-mybatis全注解化(3)

    pom.xml <!-- 引入mybatis --> <dependency> <groupId>org.mybatis.spring.boot</group ...

  9. Vue - 起手式

    0x00:前言 这次前言不想扯太多. 本文主要是记录一下自己的学习历程,顺带做一个总结. 当中有參考 Vue.js 的中文文档,也有去查看其它大大们给出的总结. 最后也是一个期盼,希望能够帮助到其它有 ...

  10. 演示一下:rm -rf /