设计模式C++实现——模板方法模式

模式定义:

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

模板就是一个方法。更具体的说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类实现。这可以确保算法的结果保持不变,同时由子类提供部分实现。

模式结构:

举例:

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

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++实现——模板方法模式,布布扣,bubuko.com

时间: 2024-12-28 11:23:26

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

设计模式--15、模板方法模式

设计模式学习笔记-模板方法模式 1. 概述 定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤. 2. 模式中的角色 2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架. 2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法. 3. 模式解读 3.1 模板方法类图 3.2 模板方法模式代码实现 /// <summary> /// 抽象类 /// </summa

设计模式入门之模板方法模式TemplateMethod

模板方法模式定义: 定义一个算法的骨架,而将步骤延迟到子类中.这种模式可以使得在不改变算法骨架(模板)的情况下修改每个步骤的具体实现 从功能上来看,这个模式跟生成器模式有些相像,只不过生成器模式定义了创建对象的过程,而模板方法模式定义了算法过程 感觉这个模式要简单很多. 钩子:可以被子类覆盖以实现扩展的方法通常叫做钩子 实例:用户登录过程,分为后台人员登录和用户登录,这是一个非常成型的技术过程,是非常典型的模板方法模式的应用,其中普通用户密码不需要加密,而工作人员的密码需要进行加密比对.上代码

设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 二.模板方法模式的应用场景 Template Method模式一般应用在具有以下条件的应用中: - 具有统一的操作步骤或操作过程 - 具有不同的操作细节 - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同 private static void Main(string[] arg

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

原文:C#设计模式之十三模板方法模式(Template Method Pattern)[行为型] 一.引言 "结构型"的设计模式已经写完了,从今天我们开始讲"行为型"设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Pattern.还是老套路,先从名字上来看看."模板方法"我第一次看到这个名称,我的理解是,有一个方法的名字叫"模板方法",后来深入学习之后,

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

引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来

设计模式之禅-模板方法模式

个人Blog 此篇博文所在地址:http://www.sanyinchenblog.com/?p=273 模板方法模式: 定义一个操作中的算法框架,将一些步骤延迟到子类中.使得子类可以不改变    一个算法的结构即可重定义该算法的某些特定步骤. Demo: https://github.com/sanyinchen/UMLDemo/tree/master/src/com/sanyinchen/templete https://github.com/sanyinchen/UMLDemo/tree/

Java设计模式(四) 之 模板方法模式

源码均以JDK1.8作为参考 1.定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤. 2.解析: 通用类图: 类图解析: 模板方法模式非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 2.1.抽象模板(AbstractClass) 主要定义了模板中一些基本操作(方法),它的方法分为两类: 基本方法: 基本方法也叫基本操作,是由子类实现的方法,并且被模板方法被调用. 模板方法: 可以由一个或几个,一般

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

模板方法模式是类的行为模式.准备一个抽象类.将部分逻辑以详细方法以及详细构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 模板方法模式的结构 模板方法模式是全部模式中最为常见的几个模式之中的一个.是基于继承的代码复用的基本技术. 模板方法模式须要开发抽象类和详细子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,还有一些设计师则负责给出这个算法的各个逻辑步骤.代表这些

调侃《Head First设计模式》之模板方法模式

现在有两个人,一个爱喝咖啡,一个爱喝茶,让我们用代码创建咖啡和喝茶: 咖啡类: 茶类: 很容易发现,咖啡喝茶的代码有惊人的相似. 经过之前设计模式的阅读,你应该已经有意识的把相同的部分抽取出来.pourInCup和boilWater方法相同,于是可以考虑将它们整合到一个公共的类中,我们可以这样设计: CaffeineBeverage是一个公共类,咖啡喝茶是它的子类,继承了相同的方法. 等下,难道相同的部分就这样?no. brewCoffeeGrinds()和steepTeaBag()两个方法,一