模板方法模式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. mysql的相关信息

    mysql数据库优化技巧 表的设计合理(字段合理,符合3NF) 添加适当索引(index)[主要4种:普通索引,主键索引,唯一索引unique,全文索引] 分表技术(水平分表->拆分表结构,垂直 ...

  2. (转)CentOs7.3 搭建 RabbitMQ 3.6 Cluster 集群服务与使用

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScript.XMPP.STO ...

  3. 如何看MFC程序

    一直以来  我都一个疑惑 如果看懂别人的MFC 程序. 今日忽然略有小悟. Q:MFC是啥? A:MFC是类库.. ************* Q :MFC 啥玩意类库? A;MFC 是封装API的类 ...

  4. MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

    悲观锁: 顾名思义,很悲观,就是每次拿数据的时候都认为别的线程会修改数据,所以在每次拿的时候都会给数据上锁.上锁之后,当别的线程想要拿数据时,就会阻塞,直到给数据上锁的线程将事务提交或者回滚.传统的关 ...

  5. Ubuntu16.04中用et对jmeter生成的数据统计成图表

    在Ubuntu系统中,用ctrl+Alt+t 打开终端: 输入et,即打开wps: 整理需要形成图表的数据,如: 用excel生成图表,如下: 表得出的性能图表,方法: 1.工具栏中选择插入——二维折 ...

  6. Linux Swap交换分区介绍

    Swap分区在系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中, ...

  7. 一键安装lnmp(2)

    all(){path=`pwd`cd $pathechoecho "exclude=*.i386 *.i686" >> /etc/yum.confrpm -ivh ht ...

  8. 20145215《Java程序设计》第二周学习总结

    教材内容总结 类型.变量与运算符 *基本类型 整数(short.int.long) 字节(byte) 浮点数(float/double) 字符(char)将一个数字字母或者符号用单引号标识,字符串用双 ...

  9. RocEDU.阅读.写作《苏菲的世界》书摘

    我们在成长的过程当中,似乎失去了对这世界的好奇心.也正因此,我们丧失了某种极为重要的能力(这也是一种哲学家们想要使人们恢复的能力).因为,在我们内心的某处,有某个声音告诉我们:生命是一种很庞大的.神秘 ...

  10. How to Enable RPMForge Repository in RHEL/CentOS 7.x/6.x/5.x

    RPMforge repository is a utility that is used to install third party software packages under Red Hat ...