当前位置: 首页 > news >正文

行为型设计模式之模板模式

文章目录

  • 概述
  • 原理
    • 结构图
    • 实现
  • 小结

概述

模板方法模式(template method pattern)原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。

模板方法中的算法可以理解为广义上的业务逻辑,并不是特指某一个实际的算法.定义中所说的算法的框架就是模板, 包含算法框架的方法就是模板方法。

模板方法模式是一种基于继承的代码复用技术,它是一种类行为模式. 模板方法模式其结构中只存在父类与子类之间的继承关系.

模板方法的作用主要是提高程序的复用性和扩展性:

  • 复用指的是,所有的子类可以复用父类中提供的模板方法代码
  • 扩展指的是,框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能.

原理

模板方法模式的定位很清楚,就是为了解决算法框架这类特定的问题,同时明确表示需要使用继承的结构。

结构图

在这里插入图片描述

实现

先看下父类,如下:

class ZooShow {
public:
private:protected:virtual bool Show0(){cout << "show0" << endl;return true;}virtual void Show2(){cout << "show2" << endl;}virtual void Show1() {}virtual void Show3() {}
};

再看看几个子类,如下:

class ZooShowEx1 : public ZooShow {
protected:virtual bool Show0(){cout << "show1" << endl;return true;}virtual void Show2(){cout << "show3" << endl;}
};class ZooShowEx2 : public ZooShow {
protected:virtual void Show1(){cout << "show1" << endl;}virtual void Show2(){cout << "show3" << endl;}
};class ZooShowEx3 : public ZooShow {
protected:virtual void Show1(){cout << "show1" << endl;}virtual void Show3(){cout << "show3" << endl;}virtual void Show4() {//}
};

这么看,是不是很清晰了。

小结

优点:

  • 在父类中形式化的定义一个算法,而由它的子类来实现细节处理,在子类实现详细的处理代码时,并不会改变父类算法中步骤的执行顺序.

  • 模板方法可以实现一种反向的控制结构,通过子类覆盖父类的钩子方法,来决定某一个特定步骤是否需要执行

  • 在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则.

缺点:

  • 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。

模板方法模式的使用场景一般有:

  • 多个类有相同的方法并且逻辑可以共用时;
  • 将通用的算法或固定流程设计为模板,在每一个具体的子类中再继续优化算法步骤或流程步骤时;
  • 重构超长代码时,发现某一个经常使用的公有方法。

好了,看下这些,应该很清晰了。知道了优缺点,也就知道了我们什么时候怎么用模模板模式。部分内容来自于零声,有兴趣,可以学习学习。

相关文章:

行为型设计模式之模板模式

文章目录 概述原理结构图实现 小结 概述 模板方法模式(template method pattern)原始定义是&#xff1a;在操作中定义算法的框架&#xff0c;将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法中的算法可以理解为广义上的业…...

大泽动力车载柴油发电机的特点和优势有哪些

大泽动力车载柴油发电机具有一系列显著的特点和优势&#xff0c;以下是对其的详细介绍&#xff1a; 低噪音性能&#xff1a;大泽动力车载柴油发电机具备明显的低噪音性能&#xff0c;其噪音限值在距离机组7米处测得为70dB(A)&#xff0c;这为用户提供了一个相对安静的工作环境…...

基于 IP 的 DDOS 攻击实验

一、介绍 基于IP的分布式拒绝服务&#xff08;Distributed Denial of Service, DDoS&#xff09;攻击是一种利用大量受控设备&#xff08;通常是僵尸网络&#xff09;向目标系统发送大量请求或数据包&#xff0c;以耗尽目标系统的资源&#xff0c;导致其无法正常提供服务的攻击…...

GPT-4o如何重塑AI未来!

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 GPT-4o似乎是一个针对GPT-4模型进行优化的版本&#xff0c;它在性能、准确性、资源效率以及安全和…...

window本地域名映射修改

位置 C:\Windows\System32\drivers\etc 文件名 hosts 修改方法 复制一份到桌面 修改桌面的文件 # 前面为ip 后面为域名&#xff0c;域名-》ip的映射 127.0.0.1 link.com最后将修改后的文件保存&#xff0c;复制到C:\Windows\System32\drivers\etc替换...

【退役之重学】为什么要加入多级缓存

一、为什么 加入多级缓存是为了提高数据访问的效率和性能 二、怎么做 在多级访问系统中&#xff0c;数据首先会被存储在速度最快的 L1 缓存中&#xff0c;如果数据在 L1 缓存中未命中&#xff0c;则会继续在 L2 缓存 和 L3 缓存中查找&#xff0c;如果在所有缓存中都未命中&…...

Redis常用命令大全

目录 1、五大数据类型的基本命令 1.1 字符串 1.2 列表 1.3 哈希 1.4 集合 1.5 有序集合 2、与key相关 2.1 查看redis数据的类型 2.2 查看当前redis库中的所有key命令 3、除了五大数据类型外常见命令 3.1 键操作 3.2 服务器操作 3.3 连接操作 3.4 发布/订阅 3.5 事…...

HttpSecurity 是如何组装过滤器链的

有小伙伴们问到这个问题&#xff0c;简单写篇文章和大伙聊一下。 一 SecurityFilterChain 首先大伙都知道&#xff0c;Spring Security 里边的一堆功能都是通过 Filter 来实现的&#xff0c;无论是认证、RememberMe Login、会话管理、CSRF 处理等等&#xff0c;各种功能都是通…...

STM32 入门教程(江科大教材)#笔记2

3-4按键控制LED /** LED.c**/ #include "stm32f10x.h" // Device headervoid LED_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_I…...

python zip()函数(将多个可迭代对象的元素配对,创建一个元组的迭代器)zip_longest()

文章目录 Python zip() 函数深入解析基本用法函数原型基础示例 处理不同长度的迭代器高级用法多个迭代器使用 zip() 与 dict()解压序列 注意事项内存效率&#xff1a;zip() 返回的是一个迭代器&#xff0c;这意味着直到迭代发生前&#xff0c;元素不会被消耗。这使得 zip() 特别…...

React.forwardRef 使用

React.forwardRef 是一个React提供的高阶组件函数&#xff0c;用于向函数组件传递ref。在函数组件中无法直接访问ref&#xff0c;如果需要在函数组件中操作子组件的DOM元素或组件实例&#xff0c;就可以使用React.forwardRef来转发ref给子组件。 当使用React.forwardRef包裹一…...

C# 中的值类型与引用类型:内存大小解析

在 C# 中&#xff0c;类型可以被归类为值类型或引用类型&#xff0c;它们在内存中的存储和管理方式不同。了解这些差异对于优化程序性能和资源管理至关重要。 值类型 (Value Types) 值类型包括所有内置的数值类型&#xff08;如 int, double 等&#xff09;、char 类型、bool…...

object对象列表使用sorted函数按照对象的某个字段排序

在Python中&#xff0c;如果你想要根据列表中对象的某个属性&#xff08;比如create_time&#xff09;来进行逆序排序&#xff0c;你可以使用sorted()函数并指定一个key参数。key参数应该是一个函数&#xff0c;该函数接受一个列表元素并返回一个用于排序的值。 假设你的objec…...

【再探】设计模式—中介者模式、观察者模式及模板方法模式

中介者模式让多对多的复杂引用关系变成一对多&#xff0c;同时能通过中间类来封装多个类中的行为&#xff0c;观察者模式在目标状态更新时能自动通知给订阅者&#xff0c;模版方法模式则是控制方法的执行顺序&#xff0c;子类在不改变算法的结构基础上可以扩展功能实现。 1 中…...

vue中使用svg图像

一 、svg图像是什么 SVG&#xff08;可缩放矢量图形&#xff09;是一种图像格式&#xff0c;它以XML文档的形式存在&#xff0c;用以描述图像中的形状、线条、文本和颜色等元素。由于其基于矢量的特性&#xff0c;SVG图像在放大或改变尺寸时能够保持图形质量不受影响。这种格式…...

Deconfounding Duration Bias in Watch-time Prediction for Video Recommendation

Abstract 观看时间预测仍然是通过视频推荐加强用户粘性的关键因素。然而&#xff0c;观看时间的预测不仅取决于用户与视频的匹配&#xff0c;而且经常被视频本身的持续时间所误导。为了提高观看时间&#xff0c;推荐总是偏向于长时间的视频。在这种不平衡的数据上训练的模型面…...

python多进程

python多进程的使用有两种方式&#xff1a; multiprocessingconcurrent的使用方式 multiprocessing的使用方式 定义线程池的数量开始处理&#xff0c;结果回调 下面以多进程下载图像为例&#xff1a; import multiprocessing import requests from io import BytesIO from…...

springboot 的yaml配置文件加密

springboot 的yaml配置文件加密 一、采用yaml 插件加密添加依赖创建启动类配置加密密钥加密需要加密的内容用过测试类编写加密的YAML配置解密配置可选&#xff1a;自定义配置扩展&#xff1a;修改ENC() 一、采用yaml 插件加密 使用Jasypt对Spring Boot的YAML配置文件进行加密是…...

npm发布、更新、删除包

如何将自己开发的依赖包发布到npmjs上供别人使用&#xff1f;五个步骤搞定&#xff01; 实现步骤&#xff1a; 创建自己的工具包项目&#xff0c;进行开发。注册npmjs账号。执行npm login在控制台登录&#xff0c;填写用户信息。执行npm publish发布包。更新及删除。 步骤一…...

【JavaEE进阶】——Mybatis操作数据库(使用注解和XML方式)

目录 &#x1f6a9;三层架构 &#x1f388;JDBC操作回顾 &#x1f6a9;什么是MyBatis &#x1f6a9;MyBatis⼊⻔ &#x1f388;准备工作 &#x1f4dd;创建⼯程 &#x1f4dd;数据准备 &#x1f388;配置数据库连接字符串 &#x1f388;写持久层代码 &#x1f388;单…...

3PEAK思瑞浦 TPA1811-SO1R SOP8 运算放大器

特性 供电电压:4伏至30伏 低功耗:25C时为55安培(典型值) 低偏移电压:25C时最大8V 零漂:0.01V/C 轨到轨输出 增益带宽积:500kHz 斜率:0.3V/us...

8岁小学生idea直接变应用,秒哒3.0刚刚把AI应用门槛打没了

允中 发自 凹非寺量子位 | 公众号 QbitAI“做应用”这件事&#xff0c;现在真的老少咸宜了&#xff1a;一个二年级小朋友&#xff0c;做了个“拼伞小程序”和操作系统。一个4人团队&#xff0c;没写过代码&#xff0c;7天搭出了覆盖9万老人的智慧养老平台。还有人靠AI做依恋类型…...

从D触发器到Latch:深入芯片底层,图解Timing Borrow如何‘偷’出时钟周期

从D触发器到Latch&#xff1a;深入芯片底层&#xff0c;图解Timing Borrow如何‘偷’出时钟周期 在数字电路设计的微观世界里&#xff0c;时钟信号如同交响乐指挥家的节拍棒&#xff0c;严格规定着每个晶体管动作的起止时刻。然而当数据路径遭遇物理极限时&#xff0c;一种被称…...

PADS VX2.4 封装制作避坑指南:从0402电阻封装实战说清Layer_25和阻焊层

PADS VX2.4 封装制作避坑指南&#xff1a;从0402电阻封装实战说清Layer_25和阻焊层 在PCB设计领域&#xff0c;封装制作看似基础却暗藏玄机。许多工程师在原理图设计阶段游刃有余&#xff0c;却在封装制作环节频频踩坑&#xff0c;导致后期生产出现焊接不良、丝印覆盖焊盘等问题…...

教育机构搭建AI辅助教学系统时如何通过Taotoken统一接口

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 教育机构搭建AI辅助教学系统时如何通过Taotoken统一接口 构建一个服务于师生的AI辅助教学系统&#xff0c;通常需要集成多种能力&a…...

保姆级教程:用LabVIEW 2023给CANoe做个外挂,实现硬件数据采集与自动化测试

保姆级教程&#xff1a;用LabVIEW 2023给CANoe做个外挂&#xff0c;实现硬件数据采集与自动化测试 在汽车电子测试领域&#xff0c;工程师们常常面临一个核心矛盾&#xff1a;CANoe作为行业标准的总线仿真工具提供了强大的协议分析和测试管理能力&#xff0c;但在面对非标硬件接…...

STM32CubeMX实战指南:ADC多通道扫描与DMA传输配置

1. ADC多通道扫描与DMA传输的核心价值 第一次用STM32做多路传感器采集时&#xff0c;我像大多数新手一样傻傻地用轮询方式读取每个ADC通道。结果发现CPU利用率直接飙到80%&#xff0c;系统卡得连LED灯都闪不利索。后来工程师老张甩给我一句话&#xff1a;"用DMA啊&#xf…...

【NotebookLM考古学研究辅助实战指南】:20年文博技术专家亲授3大冷启动技巧,让田野笔记秒变学术论文

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM考古学研究辅助的范式革命 NotebookLM 作为 Google 推出的基于文档理解的 AI 助手&#xff0c;正悄然重塑考古学研究的信息处理范式。传统考古工作依赖大量手写笔记、田野报告、碳十四测年数…...

基于Circuit Playground Express与MakeCode的阿基米德螺旋桨智能小船制作

1. 项目概述&#xff1a;当古老智慧遇见现代创客阿基米德螺旋&#xff0c;这个诞生于两千多年前的巧妙发明&#xff0c;最初被用来从低处向高处提水。它的核心原理简单而强大&#xff1a;一个旋转的螺旋面&#xff0c;能将流体或颗粒物沿着轴向“推”动。今天&#xff0c;我们不…...

TaotokenAPI密钥管理与访问控制功能的实际使用体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken API 密钥管理与访问控制功能的实际使用体验 在团队协作开发中&#xff0c;如何安全、高效地管理大模型 API 的访问权限&a…...