当前位置: 首页 > news >正文

设计模式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

请按随意键继续. . .

 

设计原则的应用:

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

相关文章:

  • 第四(装饰器、迭代器、生成器)
  • windows下实现快捷键截图小工具
  • 【jQuery】学习jQuery插件的使用与写法(表单验证插件-validation)
  • Oracle使用row_number()函数查询时增加序号列
  • 【Java基础】序列化与反序列化深入分析
  • Elasticsearch前沿:ES 5.x改进详解与ES6展望
  • 一次因为文件名开头包含空格而导致FTP文件一直无法下载的悲剧!
  • node-glob通配符
  • Bzoj1005 [HNOI2008]明明的烦恼
  • 正则表达式 取反 非
  • Git学习与使用心得(1)—— 初始化
  • [转载]Monit:开源服务器监控工具
  • 运行第一个容器 - 每天5分钟玩转容器技术(4)
  • thrift实例:python实现
  • 微信开放平台手机APP支付
  • “大数据应用场景”之隔壁老王(连载四)
  • extjs4学习之配置
  • jQuery(一)
  • laravel 用artisan创建自己的模板
  • PV统计优化设计
  • Python连接Oracle
  • springMvc学习笔记(2)
  • Terraform入门 - 3. 变更基础设施
  • vue自定义指令实现v-tap插件
  • Webpack 4x 之路 ( 四 )
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 目录与文件属性:编写ls
  • 前端面试总结(at, md)
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 说说我为什么看好Spring Cloud Alibaba
  • ​iOS安全加固方法及实现
  • ​第20课 在Android Native开发中加入新的C++类
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • $(selector).each()和$.each()的区别
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (转载)虚函数剖析
  • .bat文件调用java类的main方法
  • .NET CORE Aws S3 使用
  • .net解析传过来的xml_DOM4J解析XML文件
  • .net快速开发框架源码分享
  • .NET连接MongoDB数据库实例教程
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [<MySQL优化总结>]
  • [20160807][系统设计的三次迭代]
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [Foreman]解决Unable to find internal system admin account
  • [iOS]GCD(一)
  • [leetcode] 66. 加一
  • [one_demo_11]二分查找法
  • [python-opencv] PNG 裁切物体
  • [pytorch]手动构建一个神经网络并且训练
  • [Qt]QMainWindow