概述

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

模板方法模式的一个重要特征是它的定义在基类中(有时作为一个私有成员函数)并且不能改动—模板方法木事就是“坚持相同的代码”。它调用其他基类函数(就是那些被覆盖的虚函数)以便完成其工作,但是其他人不必直接调用这些虚函数。

模板方法的适用性

模板方法应用于一下几种情况:

  • 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
  • 各个子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
  • 控制子类扩展。

示例

#include <iostream>using namespace std;class ApplicationFramework
{
public:void templateMethod(){for(int i = 0 ; i < 5 ; ++i){customize1();customize2();}}virtual ~ApplicationFramework();protected:virtual void customize1() = 0;virtual void customize2() = 0;};class myApp : public ApplicationFramework
{
public:~myApp();
protected:void customize1(){cout << "hello ";}void customize2(){cout << "world~" << endl;}
};int main()
{myApp app;app.templateMethod();return 0;
}ApplicationFramework::~ApplicationFramework(){}
myApp::~myApp(){}

以上示例可以看到,在基类中的函数templateMethod就是一个模板方法,改方法中调用了两个虚函数,而在子类中对虚函数进行实现,在子类实例化后调用templateMethod 时,会自动调用子类中的虚函数实现。

钩子操作

模板方法模式中的钩子操作,它提供了缺省的行为,子类可以在必要时进行扩展,一个钩子操作在缺省操作的通常是一个空操作。

上面这段话可能不太好理解,简单来说,所谓的钩子操作就是在基类中定义一个虚函数(注意,不是纯虚函数)并且该虚函数有简单的实现(也可以是空操作),那么子类在必要的时候可以重新定义并实现该虚函数然后做自己的操作。这样便于在子类中进行扩展。这样一来,在模板方法中就可以通过钩子操作来知道子类中某些真正的行为。

很重要的一点是,模板方法应该指明哪些 操作是钩子操作(可以被重定义),哪些是抽象操作(必须被重定义),要有效的重用一个抽象类,子类编写者必须明确了解哪些操作是设计为有待重定义的。

将上面的示例修改一下:

#include <iostream>using namespace std;class ApplicationFramework
{
public:void templateMethod(){for(int i = 0 ; i < 5 ; ++i){customize1();customize2();}if(hookOperation()){cout << "hello everyone!";}}virtual ~ApplicationFramework();protected:virtual void customize1() = 0;virtual void customize2() = 0;//钩子操作virtual bool hookOperation(){return  false;}};class myApp : public ApplicationFramework
{
public:~myApp();
protected:void customize1(){cout << "hello ";}void customize2(){cout << "world~" << endl;}//钩子操作实现bool hookOperation(){return  true;}
};int main()
{myApp app;app.templateMethod();return 0;
}ApplicationFramework::~ApplicationFramework(){}
myApp::~myApp(){}

对于有多个子类实现时,钩子操作就可以便于子类中的扩展啦。

C++设计模式--模板方法模式相关推荐

  1. 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式

        前段时间学习了一些设计模式,最近在做项目的过程中恰巧用到了其中的一个--模板方法模式.这个模式在程序设计过程中可是为小编省去了不少的代码量呢.具体是怎样应用的呢?接下来小编为您分享. 前面博文 ...

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

    23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...

  3. 『设计模式』设计模式--模板方法模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...

  4. 行为型设计模式---模板方法模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  5. Java设计模式-模板方法模式详解

    Java设计模式-模板方法模式 文章目录 Java设计模式-模板方法模式 0.前言 1.模板方法原理 2.模板方法模式中的角色 3.模板方法模式的UML类图 4.代码实现 5.编码测试 6.模板模式中 ...

  6. Java设计模式 - 模板方法模式

    Java设计模式 - 模板方法模式 定义一个算法的骨架,并将一些步骤通过子类表达. UML图示 要点 1. 定义一个算法的骨架 - 建立一个抽象类 2. 将一些步骤通过子类表达 - 子类继承抽象类 赋 ...

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

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

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

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

  9. 模板设计模式_设计模式-模板方法模式

    一.模板方法模式的定义 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计 ...

  10. 大话设计模式—模板方法模式

    在模板方法模式(TemplateMethod Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于 ...

最新文章

  1. 代码开源!激光雷达 SLAM 的闭环检测:OverlapNet
  2. transformer引燃机器学习圈 万能的
  3. 关于顺序栈的基本操作
  4. python cookbook 豆瓣_备受好评的20本python图书,不用到处找了!
  5. CentOS命令行界面与图形界面切换(图文详解)
  6. openwrt 19 overlay 空间不足_重视 | 山西一矿井瓦斯爆炸,有限空间作业切记注意安全...
  7. 前台页面优化全攻略(二)
  8. 蓝桥杯 ALGO-111 算法训练 明明的随机数
  9. go-结构化,方法的创建以及使用
  10. Wireshark实战分析之IP协议(二)
  11. [答疑]纪检监察部门的业务用例图
  12. 精细化管理设备资产,降低企业运营成本
  13. Mixly 二次开发 自定义库 OLED
  14. 压缩气体储能领域新势力「嘉泰新能」获AC资本天使轮投资!
  15. tipask二次开发总结_tipask二次开发总结.docx
  16. 搜狗校招编程题-建房子
  17. 邓凡平WIFI学习笔记4:WiFi Simple configuration
  18. 【网络】如何扫描局域网内所有设备的ip和mac地址
  19. linux系统怎么两个盘对拷,Linux分区对拷等小技巧
  20. linux 遍历目录查找文件find太慢,Linux下比find快N倍的文件查找命令

热门文章

  1. 云信迎来五周年里程碑:日活破3亿,消息量破10000亿
  2. 网易技术干货 | 云信移动端音视频UI自动化测试实践
  3. MCtalk对话学霸君:在线教育“1对多小班化”是个伪命题
  4. 网易云信与林鹿科技联手推出云对讲服务
  5. mongodb查看数据库和表的信息
  6. 监控 SQL Server 的运行状况
  7. Android 5.x Theme 与 ToolBar 实战
  8. 动态编译MySQL plugin
  9. PlateSpin forge V2P回推步骤。
  10. k8s给default serviceaccount绑定cluster-admin操作命令