模板方法模式(Template Method)

news2025/1/22 18:06:01

参考:

模板方法设计模式 (refactoringguru.cn)

design-patterns-cpp/TemplateMethod.cpp at master · JakubVojvoda/design-patterns-cpp · GitHubhttps://github.com/JakubVojvoda/design-patterns-cpp/blob/master/state/State.cpp)

文章目录

    • 一、什么是模板方法模式?
    • 二、实现
    • 三、优缺点
      • 优点
      • 缺点
    • 四、适用环境
    • 五、与其他模式的关系

一、什么是模板方法模式?

模板方法模式定义:是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。

如在构建造房屋时,有一些基本的步骤,例如打地基、 建造框架、 建造墙壁和安装水电管线等。标准房屋建造方案中可提供几个扩展点,允许潜在房屋业主调整成品房屋的部分细节。使得成品房屋会略有不同。

在这里插入图片描述

二、实现

模板方法(Template Method)模式包含以下主要角色:

1、抽象类(Abstract­ Class):会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
2、具体类(Concrete­ Class):可以重写所有步骤, 但不能重写模板方法自身。

在这里插入图片描述

/*
 * C++ Design Patterns: Template Method
 * Author: Jakub Vojvoda [github.com/JakubVojvoda]
 * 2016
 *
 * Source code is licensed under MIT License
 * (for more details see LICENSE)
 *
 */

#include <iostream>

/*
 * AbstractClass
 * implements a template method defining the skeleton of an algorithm
 */
class AbstractClass
{
public:
  virtual ~AbstractClass() {}
  
  void templateMethod()
  {
    // ...
    primitiveOperation1();
    // ...
    primitiveOperation2();
    // ...
  }
  
  virtual void primitiveOperation1() = 0;
  virtual void primitiveOperation2() = 0;
  // ...
};

/*
 * Concrete Class
 * implements the primitive operations to carry out specific steps
 * of the algorithm, there may be many Concrete classes, each implementing
 * the full set of the required operation
 */
class ConcreteClass : public AbstractClass
{
public:
  ~ConcreteClass() {}
  
  void primitiveOperation1()
  {
    std::cout << "Primitive operation 1" << std::endl;
    // ...
  }
  
  void primitiveOperation2()
  {
    std::cout << "Primitive operation 2" << std::endl;
    // ...
  }
  // ...
};


int main()
{
  AbstractClass *tm = new ConcreteClass;
  tm->templateMethod();
  
  delete tm;
  return 0;
}

三、优缺点

优点

  • 你可仅允许客户端重写一个大型算法中的特定部分,使得算法其他部分修改对其所造成的影响减小。
  • 你可将重复代码提取到一个超类中。

缺点

  • 部分客户端可能会受到算法框架的限制。
  • 通过子类抑制默认步骤实现可能会导致违反里氏替换原则。
  • 只要算法发生变化,你就可能需要修改所有的类。

四、适用环境

  • 当你只希望客户端扩展某个特定算法步骤,而不是整个算法或其结构时,可使用模板方法模式。
  • 当多个类的算法除一些细微不同之外几乎完全一样时,你可使用该模式。

五、与其他模式的关系

  • 工厂方法模式模板方法模式的一种特殊形式。同时,工厂方法可以作为一个大型模板方法中的一个步骤。
  • 模板方法基于继承机制: 它允许你通过扩展子类中的部分内容来改变部分算法。 策略模式基于组合机制: 你可以通过对相应行为提供不同的策略来改变对象的部分行为。模板方法在类层次上运作,因此它是静态的。策略在对象层次上运作, 因此允许在运行时切换行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

41_STM32CAN外设简介

目录 STM32的CAN外设简介 CAN控制内核 工作模式 位时序及波特率 CAN发送邮箱 CAN接收FIFO 验收筛选器 筛选器设置举例 STM32的CAN外设简介 STM32的芯片中具有bxCAN控制器(Basic Extended CAN),它支持CAN协议2.0A和2.0B标准。 该CAN控制器支持最高的通讯速率为1Mb/s;可…

汉字风格迁移篇--KAGAN:一种中国诗歌风格转换的方法

🚀针对问题: 以往的方法都是针对单字图像,容易忽略了中文句子或一张图像中包含的多个字符。 🚀提出的方法: Constancy Loss, Smooth L1 loss;TV loss ,key-attention mechanism GAN;多通道鉴别器 🚀使用的指标 L1 Loss ,SSIM, PSNR, LPIPS 已有工作 字符风…

LiveGBS国标流媒体平台-海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

GB/T28181国标流媒体平台海康大华宇视华为等硬件NVR摄像机注册到LiveGBS国标平台看不到设备的时候如何抓包及排查1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查…

java计算机毕业设计基于安卓Android的学生作业管理系统APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把学生作业管理与现在网络相结合,利用java技术建设学生作业管理APP,实现学生作业管理的信息化。则对于进一步提高学生作业管理发展,丰富学生作业管理经验能起到不少的促进作用。 学生作业管理APP能够通过互联网得到广泛的、…

国内船载B级(CSTDMA)AIS设备使用问题简析

2019-06-30 01:45王晏海朱小平 航海订阅 2019年3期 收藏 王晏海 朱小平 国内船载B级&#xff08;CSTDMA&#xff09;AIS设备使用问题简析_参考网 摘 要&#xff1a;国内船载B级AIS大多采用载波侦听时分多址&#xff08;CSTDMA&#xff09;技术&#xff0c;目前仍存在部分船…

已解决raise JSONDecodeError(“Expecting value”, s, err.value) from None

已解决raise JSONDecodeError(“Expecting value”, s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 文章目录报错代码报错翻译报错原因解决方法帮忙解决报错代码 粉丝群一个小伙伴想用Python读取json报错&#xff0c;但是…

分布式基础篇1——环境搭建

一、项目简介1、电商模式2、项目前置知识3、项目技术&特色4、项目架构图5、微服务划分图二、分布式基础概念1、微服务2、集群&分布式&节点3、远程调用4、负载均衡5、服务注册/发现&注册中心6、配置中心7、服务熔断和服务降级8、API网关三、环境搭建1、使用 Vag…

PGL 系列(三)词向量 Skip-gram

环境 python 3.6.8paddlepaddle-gpu 2.3.0numpy 1.19.5一、Skip-gram概念 Skip-gram:根据中心词推理上下文 在Skip-gram中,先在句子中选定一个中心词,并把其他词作为这个中心词的上下文。如 上图 Skip-gram所示,把“spiked”作为中心词,把“Pineapples、are、and、yellow”…

万亿数字化市场,数据科学为何能扛起“价值担当”?

数据科学家&#xff0c;被誉是“21世纪最性感的职业”。 如今&#xff0c;一股数据科学的热潮正席卷国内各大高校。今年十月底&#xff0c;一系列数据科学的网络直播课在多所大学火爆异常&#xff0c;吸引来自北大、清华、北师大、哈工大、浙大等多所高校学生广泛参与。 该系…

低碳正在成为春城的新名片

导读&#xff1a;分布式光伏&#xff0c;昆明树立了新标杆。 提到昆明&#xff0c;很多人的第一印象是“春城”。“天气常如二三月&#xff0c;花枝不断四时春”&#xff0c;从古至今&#xff0c;人们毫不吝啬对这座宜居城市的赞誉。在绿色能源时代&#xff0c;昆明也有得天独厚…

进程间通信--共享内存篇

文章目录共享内存的概念共享内存使用须知创建共享内存共享内存的映射与链接共享内存的映射取消共享内存的删除共享内存实现进程通信总结共享内存的概念 共享内存字面理解就是进程间共同享有的存储空间&#xff0c;不同于管道通信&#xff0c;共享内存就像是进程自己的空间一样…

磷脂PEG化靶向蛋白肽系列 DSPE-PEG- RGR(CRGRRST)/ TH/ R8/ NGR 为华生物提供

品牌&#xff1a;为华生物 产地&#xff1a;广州 中文名称:磷脂-聚乙二醇-肿瘤靶向蛋白 肿瘤靶向蛋白-聚乙二醇-磷脂 英文名称: DSPE-PEG- RGR&#xff08;CRGRRST&#xff09; PEG分子量400、600、1k、2k、3.4k、5k、10k其他分子量可定制 分子量&#xff1a;根据客户需求定制…

002.爬楼梯

1.题目链接&#xff1a; 70. 爬楼梯 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给个阶数 n&#xff0c;要求返回爬完 n 阶有几种方法。 一次可以爬 1 步 或者 2 步。 示例 1 输入&#xff1a;n 1 输出&#xff1a;1 解释&#xff1a;有一种方法可以爬到楼顶。 1.…

springBoot集成webSocket并使用postMan进行测试

简单描述 简单来讲&#xff0c;webSocket是一种在http协议基础上的另一种新协议&#xff0c;叫ws协议。 http协议是单工通信&#xff0c;客户端发起请求&#xff0c;服务端收到请求并处理&#xff0c;返回给客户端&#xff0c;然后客户端收到服务端的请求。 ws协议是全双工通…

代码随想录训练营第51天|LeetCode 309.最佳买卖股票时机含冷冻期、 714.买卖股票的最佳时机含手续费

参考 代码随想录 题目一&#xff1a;LeetCode 309.最佳买卖股票时机含冷冻期 如果没有冷冻期&#xff0c;就可以只定义两个状态&#xff0c;加入冷冻期后定义下面的四个状态&#xff1a; 状态一&#xff08; j 0&#xff09;&#xff1a;买入状态&#xff0c;不一定当天买…

设计模式-java

设计模式: 纸上得来终觉浅&#xff0c;绝知此事要躬行 设计原则 1) 单一职责原则 com.zh.designpatterns.design_principles.demo01_single_principle 概念&#xff1a;对类来说的&#xff0c;即一个类应该只负责一项职责。如类A负责两个不同职责&#xff1a;职责1&#x…

[AAAI 2022]多角度意图分解图网络的捆绑推荐

Multi-View Intent Disentangle Graph Networks for Bundle Recommendation捆绑推荐是什么&#xff1f;Bundle recommendation offers promotions of bundled items instead of a single one, which is a common strategy for sales revenue increase and latent customer mini…

谈谈对IO多路复用的select机制的理解

一、技术背景 如果要彻底明白select机制&#xff0c;还是要首先去了解IO&#xff0c;网络编程、Blocking IO、No Blocking IO的相关概念及底层实现。下面只是作为技术背景去介绍这几个概念。 1、理解IO本质 IO从英文本身去解释就是输入输出(Input/Output)&#xff0c;这里不…

web前端期末大作业:基于HTML+CSS+JavaScript实现网上鲜花店网站设计(14页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

手机进销存网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 功能模块包括&#xff1a;员工模块、手机类型模块、供应商模块、采购模块、客户模块、销售模块、统计模块、库存模块 (1…