模板方法模式C++实现

1定义

定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

实现方案:将算法/逻辑框架放在抽象基类中,并定义好实现接口,在子类中实现细节接口。

注:策略模式,解决的是相同的问题,只是其方案是将各个接口封装为类,通过委托/组合方式解决问题

2类图

3实现

class AbstractClass

{

public:

  void Run()

  {

    DoA();

    DoB();

    DoC();

  }

  virtual void DoA()=0;

  virtual void DoB()=0;

  virtual void DoC()=0;

};

class ConcreteClass:public AbstractClass

{

public:

  void DoA()

  {

    cout << "开车门"<<endl;

  }

  void DoB()

  {

    cout << "关车门"<<endl;

  }

  void DoC()

  {

    cout << "发车走人"<<endl;

  }

};

void Test()

{

  AbstractClass *car = new ConcreteClass();

  car->Run();

}

3成员

基本方法,由子类实现的方法,并且在模板方法中被调用。

模板方法,是一个或者几个,一般是一个具体方法/框架,实现对基本方法的调度,完成固定的逻辑。

4应用

①优点

封装不变部分/逻辑框架,扩展可变部分/具体细节

提取公共部分代码,便于维护

行为由父类控制,子类实现-->基本方法子类实现,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则

②缺点

因为模板方法将依赖点到,抽象中的框架实现依赖具体类的细节实现。所以是子类行为影响了父类。在复杂项目中,会造成代码阅读困难。

5 使用场景

多个子类有共有的方法,并且逻辑相同/逻辑相同,细节有差异

对重要,复杂的算法,可以讲核心算法设计为模板方法,周边细节由子类实现

重构时,经常使用的方案,将相同的代码抽象到父类,通过钩子函数约束行为。

6扩展

①对于原定框架中的模板方法,如果存在子类中对某个接口的具有选择性(执行或者不执行),那么在调用时就需要具体判别这种差异性调用。

②对这种选择性,用过钩子,策略模式等方案。判别,调用。然后在子类中实现具体的钩子定义。

7狡辩

父类调用子类的方法:

①把子类传递到父类的有残构造函数,然后调用

②使用反射的方式调用

③父类调用子类的静态方法

虽然这几种方式也实现了父类调用子类方法,但是在项目中并不能运用。子类简历框架,子类在重写了父类部分方法后,再调用从父类集成的方法,产生不同的结果。这正是模板方法--曲线救国。

8应用

在开元框架中,模板方法提供了一个抽象类,然后开元框架写一堆子类。如果需要扩展功能,可以继承这个抽象类,然后覆写protected方法,然后调用一个execute(run)方法,就完成功能扩展。

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

  1. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  2. 结合JDK源码看设计模式——模板方法模式

    前言: 相信很多人都听过一个问题:把大象关进冰箱门,需要几步? 第一,把冰箱门打开:第二,把大象放进去:第三,把冰箱门关上.我们可以看见,这个问题的答案回答的很有步骤.接下来我们介绍一种设计模式--模 ...

  3. 瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)

    简介 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template M ...

  4. C#设计模式-模板方法模式

    提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下 ...

  5. java设计模式 模板方法模式Template Method

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

  6. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  7. 深入浅出设计模式——模板方法模式(Template Method Pattern)

    模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式 ...

  8. 设计模式-模板方法模式(Head First)

    参考书籍:Head First设计模式 什么是模板方法模式 定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 怎 ...

  9. javascript设计模式——模板方法模式

    前面的话 在javascript开发中用到继承的场景其实并不是很多,很多时候喜欢用mix-in的方式给对象扩展属性.但这不代表继承在javascript里没有用武之地,虽然没有真正的类和继承机制,但可 ...

  10. C++设计模式——模板方法模式

    模板方法模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不 ...

随机推荐

  1. 《闪存问题之PROGRAM DISTURB》总结

    来自 http://www.ssdfans.com/?p=1814 SSD之所以需要BCH或LDPC等ECC纠错算法,是因为闪存中的数据会在神不知鬼不觉的情况下发生比特翻转. 导致比特翻转的原因很多, ...

  2. Spring框架第五篇之Spring与AOP

    一.AOP概述 AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运 ...

  3. STL make_heap push_heap pop_heap sort_heap

    make_heap: default (1) template <class RandomAccessIterator> void make_heap (RandomAccessItera ...

  4. git 更新某个文件

    1.拉取某个仓库的某个文件 git fetch git checkout origin/master test.php

  5. ACM-ICPC 2018 沈阳赛区网络预赛 G. Spare Tire (容斥原理)

    可推出$a_n = n^2+n, $ 设\(S_n = \sum_{i=1}^{n} a_i\) 则 \(S_n = \frac{n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2} ...

  6. redis数据持久化内存不足

    原因:写数据到redis里面写不进去,查看redis日志显示: Can't save in background: fork: Cannot allocate memory 在小内存的进程上做一个fo ...

  7. Oracle数据库创建表ID字段的自动递增

    转载地址:http://blog.itpub.net/22880668/viewspace-1117343/ 将表t_uaer的字段ID设置为自增:(用序列sequence的方法来实现) ----创建 ...

  8. PHP 实现归并排序算法

    算法原理 原理: 利用递归,先拆分.后合并.再排序. 步骤: 均分数列为两个子数列 递归重复上一步骤,直到子数列只有一个元素 父数列合并两个子数列并排序,递归返回数列 代码实现 // 归并排序主程序 ...

  9. java压缩多个文件

    首先创建一个工具类,定义好接口,这里的参数1:fileList:多个文件的path+name2: zipFileName:压缩后的文件名 下面是代码,注释已经很详细了 public class ZIP ...

  10. 扒开系统调用的三层皮(下)/给MenuOS增加time和time-asm命令

    上周从用户态的角度去理解系统调用 这周通过内核的方式 调试和跟踪系统调用来理解 rm menu -rf  强制删除原menu文件 git clone https://github.com/mengni ...