模式定义:

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

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

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

模式结构:

举例:

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

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】Ubuntu配置服务自启动 sysv-rc-conf

    在Ubuntu下,配置服务系统开机自启动,使用的不是chkconfig,而是sysv-rc-conf. 且看如下: 安装: sudo apt-get install sysv-rc-conf 帮助信息 ...

  2. 搭建持续集成单元测试平台(Jenkins+Ant+Java+Junit+SVN)

    一.环境准备 Jenkins: 到官网下载jenkins.war包:http://jenkins-ci.org/ 安装方法有两种: 把下载下来的jenkins.war包放到文件夹下,如C:\jenki ...

  3. uni - 自定义组件

    目录结构如下 点击下载自定义组件示例

  4. Centos7中安装Docker

    1.配置docker镜像安装源 tee /etc/yum.repos.d/docker.repo <<-'EOF' [dockerrepo] name=Docker Repository ...

  5. 转:nginx模块开发——handler(二)

    模块上下文结构 这是一个ngx_http_module_t类型的静态变量.这个变量实际上是提供一组回调函数指针,这些函数有在创建存储配置信息的对象的函数,也有在创建前和创建后会调用的函数.这些函数都将 ...

  6. Android Studio导入Eclipse项目的两种方法

    Android Studio导入Eclipse项目有两种方法,一种是直接把Eclipse项目导入Android Studio,另一种是在Eclipse项目里面进行转换,然后再导入Android Stu ...

  7. Emacs 使用graphviz-dot-mode创建架构图

    安装 首先要安装graphviz-dot-mode模块,假设list-packages的网站国内无法訪问,改为手动下载graphviz-dot-model.el.放到~/.emacs.d/文件夹下. ...

  8. 获取ul下li标签里点击的是哪一个li并获取li里a标签的值

    $("ul li").click(function(){ //获取当天月份 ).text(); ,) alert(month); }); <!doctype html> ...

  9. node中__dirname、__filename、process.cwd()表示的路径

    直接上结论:__dirname 表示当前文件所在的目录的绝对路径__filename 表示当前文件的绝对路径module.filename ==== __filename 等价process.cwd( ...

  10. Java多线程之syncrhoized内置互斥锁的用法详解

       转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827547.html    解决并行冲突最有效的方法就是加同步锁,主要有以下几种方法:   1:动态方法 ...