C++设计模式实现--模板(Template)模式

一. 问题

在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。Template提供了这种情况的一个实现框架。

二. 模式

Template 模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节

三. 代码

[cpp] view
plain
copy

  1. //抽象基类,实现了一个模板方法
  2. class AbstractClass
  3. {
  4. public:
  5. virtual ~AbstractClass()
  6. {
  7. }
  8. //模板方法,只在抽象基类中实现
  9. void TemplateMethod()
  10. {
  11. this->PrimitiveOperation1();
  12. this->PrimitiveOperation2();
  13. }
  14. protected:
  15. virtual void PrimitiveOperation1() = 0;
  16. virtual void PrimitiveOperation2() = 0;
  17. AbstractClass()
  18. {
  19. }
  20. };
  21. //具体子类,实现操作的特定细节
  22. class ConcreteClass1:public AbstractClass
  23. {
  24. public:
  25. ConcreteClass1()
  26. {
  27. }
  28. ~ConcreteClass1()
  29. {
  30. }
  31. protected:
  32. void PrimitiveOperation1()
  33. {
  34. cout<<"ConcreteClass1...PrimitiveOperation1"<<endl;
  35. }
  36. void PrimitiveOperation2()
  37. {
  38. cout<<"ConcreteClass1...PrimitiveOperation2"<<endl;
  39. }
  40. };
  41. //具体子类,实现操作的特定细节
  42. class ConcreteClass2:public AbstractClass
  43. {
  44. public:
  45. ConcreteClass2()
  46. {
  47. }
  48. ~ConcreteClass2()
  49. {
  50. }
  51. protected:
  52. void PrimitiveOperation1()
  53. {
  54. cout<<"ConcreteClass2...PrimitiveOperation1"<<endl;
  55. }
  56. void PrimitiveOperation2()
  57. {
  58. cout<<"ConcreteClass2...PrimitiveOperation2"<<endl;
  59. }
  60. };
  61. int main()
  62. {
  63. AbstractClass* p1 = new ConcreteClass1();
  64. AbstractClass* p2 = new ConcreteClass2();
  65. p1->TemplateMethod();
  66. p2->TemplateMethod();
  67. return 0;
  68. }

其关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。

C++设计模式实现--模板(Template)模式,布布扣,bubuko.com

时间: 2024-10-24 17:07:50

C++设计模式实现--模板(Template)模式的相关文章

设计模式之模板木模式

有时候有些事情可以分为几个步骤,但是具体每步做什么事可能不一样,这种情况下就是适合使用模板模式. 模板模式就是定义做一件事情需要做哪几步抽象出来,具体的实现交给继承类,然后抽象类里面定义一个执行方法按顺序调用之前定义的那些步骤. 举个具体情况,大家往冰箱放东西可以分为这几步: 1.买冰箱(如果有可以不用买) 2.打开冰箱门 3.放入东西 4.关闭冰箱门. 我们可以定义一个抽象模板,在模板定义这些步骤抽象方法,然后定义一个执行方法来以一定顺序调用之前定义的步骤.一般这个执行方法为了不让子类去修改会

【设计模式】模板模式

引子 这是一个很简单的模式,却被非常广泛的使用. 之所以简单是因为在这个模式中仅仅使用到了继承关系. 继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子. “使用委派关系代替继承关系”, “尽量使用接口实现而不是抽象类继承”等等专家警告,让我们大家对继承“另眼相看”. 其实,继承还是有很多自身的优点所在.只是被大家滥用的似乎缺点更加明显了. 合理的利用继承关系,还是能对你的系统设计起到很好的作用的. 而模板方法模式就是其中的一个使用范例. 定义与结构 模板方法(Template Method)

设计模式之模板模式

模板模式是一个非常简单的行为类模式. 模板方法Gof的定义是:在一个方法里定义算法的骨架,将一些步骤延迟到其子类. 模板模式包含一个抽象的类和它的实现类,我们在抽象类中定义骨架,需要用到的方法都是抽象方法,具体的实现由它的子类来完成. eg: public abstract class Template{ public void printDate(){ // 显示排序后的List sort(list); } public List sort(List list); } public class

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

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

Template模式详解--设计模式(12)

Template模式来源:    在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的.Template提供了这种情况的一个实现框架. Template模式作用: Template模式又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤. 我们使用冲泡咖啡和冲泡茶的例子 加工流程: 咖啡冲

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

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

Spring中的设计模式:模板模式

导读 模板模式在是Spring底层被广泛的应用,比如事务管理器的实现,JDBC模板的实现. 文章首发于作者的微信公众号[码猿技术专栏] 今天就来谈谈「什么是模板模式」.「模板模式的优缺点」.「模板模式的简单演示」.「模板模式在Spring底层的实现」. 什么是模板模式 模板模式首先要有一个抽象类,这个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式. 定义:「定义一个操作中的算法骨架,而将算法的一些步骤延

Java模板模式(Template模式)

Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: public abstract class Benchmark { /** * 下面操作是我们希望在子类中完成 */ public abstract void benchmark(); /** * 重复执行benchmark次数 */ public final long repeat (int coun

设计模式大类--行为模式(上)

大概有10中行为模式,分为上中下三篇.一.Template(模板)描述:定义一些操作算法的骨架,将其实现延迟到其子类好处:扩展性强 例子:Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: public abstract class Benchmark{ /** * 下面操作是我们希望在子类中完成 */ public abstract void benchmark(); /** * 重复执行benchmark次数 */ public fina