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

模板方法模式(Template Method)

模式结构图

在这里插入图片描述

说明

基本方法模板方法的组成部分。基本方法分为一下三种:

  • 抽象方法
    • 由抽象类声明,由其具体子类实现。C++中就是纯虚函数。
  • 具体方法
    • 由抽象类或具体类声明并实现,子类可以进行覆盖也可以继承。C++中是虚函数。
  • 钩子方法
    • 由抽象类或具体类声明并实现,子类可能会加以扩展。

其中钩子方法比较特殊,通常在父类给出的实现是一个空实现,并以该实现作为方法的默认实现。当然,默认实现也可以是非空。

模板方法模式中,钩子方法分为两类。
第一类钩子方法可以与一些具体步骤“挂钩”,以确定在不同条件下执行模板方法中的不同步骤,这类钩子方法的返回值通常是boolean类型的,这类方法一般为isXXX(),用于对某个条件进行判断,如果条件满足则执行某一步骤,否则不执行。
如下所示:

void TemplateMethod::template()
{open();display();if(isPrint){print();}
}
bool TemplateMethod::isPrint()
{return true;
}

在代码中isPrint()是钩子方法,它可以决定print()方法是否执行,一般情况下,钩子方法返回值为true,如果不希望某方法执行,可以在其子类中覆盖钩子方法,将其返回值改为false。这种钩子方法可以控制方法的执行,对一个算法进行约束。

第二类钩子方法就是实现体为空的具体方法,子类可以根据需要覆盖或者继承这些钩子方法,与抽象方法相比,钩子方法的好处在于如果没有覆盖父类中定义的钩子方法,编译可以通过,但是如果没有覆盖父类中抽象方法,编译将报错。

子类的钩子方法覆盖父类的钩子方法,可以通过子类对父类方法的执行进行约束,实现对父类的反向控制。

模板方法模式适用场景

  1. 一次性实现一个算法的不变部分,并将可变行为留给子类来实现
  2. 各子类中公共的行为应被提取出来,并集中到一个公共父类中,以避免代码重复。首先需要识别现有代码中的不同之处,并且将不同之处分离为新的操作,然后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  3. 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。
  4. 控制子类的扩展。模板方法只在特定点调用钩子方法,这样就只允许在这些点进行扩展,也就是说对于某些方法,可以通过钩子方法来进行扩展,而对于不能进行扩展的方法也可以将其定义为final方法,对算法的扩展进行有效的控制和约束。

扩展

  • 继承的使用
    • 在扩展抽象层时采用继承,具体类之间的复用 以及 抽象层之间的相互调用则使用关联关系。
  • 好莱坞原则
    • 子类不需要调用父类,而通过父类来调用子类,将某些步骤的实现写在子类中,由父类来控制整个过程。

实例

银行业务办理

在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;class BankTemplateMethod {
public:virtual ~BankTemplateMethod() = default;virtual void take_number() final { cout << "取号" << endl;};virtual void transact() = 0;virtual void evaluate() final { cout << "反馈评分" << endl; };virtual void process() final {this->take_number();this->transact();this->evaluate();};
};class Deposit : public BankTemplateMethod {
public:void transact() override { cout << "存款" << endl;}
};class Withdraw : public BankTemplateMethod {
public:void transact() override { cout << "取款" << endl; }
};class Transfer : public BankTemplateMethod {
public:void transact() override { cout << "转账" << endl; }
};int main (void)
{vector<BankTemplateMethod *> banks{new Deposit(),new Withdraw(),new Transfer()};for (auto i : banks) {i->process();cout << "\n";}for (auto i : banks) {delete i;}
}

相关文章:

模板方法模式(Template Method)

模式结构图 说明 基本方法是模板方法的组成部分。基本方法分为一下三种&#xff1a; 抽象方法 由抽象类声明&#xff0c;由其具体子类实现。C中就是纯虚函数。 具体方法 由抽象类或具体类声明并实现&#xff0c;子类可以进行覆盖也可以继承。C中是虚函数。 钩子方法 由抽象类…...

C C++ typedef的使用

一、为基本数据类型起别名 typedef int myint; myint x 5; "myint"是"int"的别名&#xff0c;可以使用"myint"来代替"int"声明变量&#xff0c;这个很好理解&#xff0c;但是也很少有人这么用吧。 二、为结构体起别名 …...

Laravel框架03:DB类操作数据库

Laravel框架03&#xff1a;DB类操作数据库一、概述二、数据表的创建与配置三、增删改操作1. 增加信息2. 修改数据3. 删除数据四、查询操作1. 取出基本数据2. 取出单行数据3. 获取一个字段的值4. 获取多个字段的值5. 排序6. 分页五、执行任意的SQL语句一、概述 按照MVC的架构&a…...

数据结构期末复习总结(前章)

作者的话 作为一名计算机类的学生&#xff0c;我深知数据结构的重要性。在期末复习前&#xff0c;我希望通过这篇博客给大家一些复习建议。希望能帮助大家夯实数据结构的基础知识&#xff0c;并能够更好地掌握数据结构和算法的应用。 一、绪论 数据&#xff1a;信息的载体&am…...

设计环形队列

文章目录1.思路分析1.1队列空满分析1.2出队分析2.循环队列设计1.思路分析 1.1队列空满分析 首先我们假设一个长度为4的环形队列 队头front 队尾rear 当队列为空时 frontrear 当队列满时 frontrear 所以我们无法判断队列是满的或者空的 因此我们多加入一个空间使队列长度为5&am…...

面向对象之-接口鉴权

1 需求 1.1 需求背景 为了保证接口调用的安全性&#xff0c;我们希望设计实现一个接口调用鉴权功能&#xff0c;只有经过认证之后的系统才能调用我们的接口&#xff0c;没有认证过的系统调用我们的接口会被拒绝。 2 需求分析 2.1 基础分析 对于如何做鉴权这样一个问题&…...

Python 多进程多线程线程池进程池协程

目录 一、线程与进程很简单的介绍 1.1 线程与进程的区别 二、多进程Process 2.1 多进程与多线程的区别 2.2 多进程为啥要使用队列 2.3 控制进程运行顺序 2.3.1 join &#xff0c; 2.3.1 daemon 守护进程 2.4 进程id 2.5 进程 存活状态is_alive() 2.5 实现自定义多…...

【自然语言处理】基于句子嵌入的文本摘要算法实现

基于句子嵌入的文本摘要算法实现人们在理解了文本的含义后&#xff0c;很容易用自己的话对文本进行总结。但在数据过多、缺乏人力和时间的情况下&#xff0c;自动文本摘要则显得至关重要。一般使用自动文本摘要的原因包括&#xff1a; 减少阅读时间根据摘要&#xff0c;选择自…...

fiddler抓包

一、工具介绍Fiddler是一个通过代理的方式来进行抓包工具&#xff0c;运行时会在本地建立一个代理服务&#xff0c;默认地址&#xff1a;127.0.0.1:8888。Fiddler开启之后&#xff0c;配置本机代理&#xff0c;再打开IE浏览器&#xff0c;IE的PROXY会自动变成127.0.0.1:8888&am…...

【Linux】网络套接字编程

前言 在掌握一定的网络基础&#xff0c;我们便可以先从代码入手&#xff0c;利用UDP协议/TCP协议进行编写套接字程序&#xff0c;明白网络中服务器端与客户端之间如何进行连接并且通信的。 目录 一、了解源目的IP、端口、网络字节序、套接字 端口号&#xff1a; 套接字&…...

break与continue关键字

1.概述 不知道大家有没有这样一种感受哈&#xff0c;有的时候容易混淆break语句和continue语句的用法&#xff0c;总是模棱两可&#xff0c;不敢确定自己是否使用正确了。正好&#xff0c;我们本篇的重点就是break和continue关键字的用法。 2.使用场景 Java中为啥会诞生break…...

kafka使用入门案例与踩坑记录

每次用到kafka时都会出现各种奇怪的问题&#xff0c;综合实践&#xff0c;下面汇总下主要操作步骤&#xff1a; Docker镜像形式启动 zookeeper启动 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeperkafka启动 docker run --name kafka01 -p 9092:909…...

系统启动太慢,调优后我直呼Nice

问题背景最近在负责一个订单系统的业务研发&#xff0c;本来不是件困难的事。但是服务的启动时间很慢&#xff0c;慢的令人发指。单次启动的时间约在10多分钟左右&#xff0c;基本一次迭代、开发&#xff0c;大部分的时间都花在了启动项目上。忍无可忍的我&#xff0c;终于决定…...

java知识点

文章目录异常写法JVM加载反射访问private调用方法动态代理注解元数据&#xff1a;TargetRetention元注解泛型编写泛型擦拭法局限通配符无限定通配符(<?>)集合重写方法和实现类IO流字节与字符转换同步和异步可以设置编码的类Print*类Files时间与日期时区一种二种三种异常…...

文件的打开关闭和顺序读写

目录 一、文件的打开与关闭 &#xff08;一&#xff09;文件指针 &#xff08;二&#xff09; 文件的打开和关闭 二、文件的顺序读写 &#xff08;一&#xff09;fputc 1. 介绍 2. 举例 &#xff08;二&#xff09;fgetc 1. 介绍 2. 举例1 3. 举例2 &#xff08;三&…...

(十八)操作系统-进程互斥的软件实现方法

文章目录一、知识总览二、单标志法三、双标志先检查法四、双标志后检查法五、Peterson算法六、总结一、知识总览 二、单标志法 算法思想&#xff1a;两个进程在访问临界区后&#xff0c;会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进…...

2023年三月份图形化一级打卡试题

活动时间 从2023年3月1日至3月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…...

linux 防火墙管理-firewalld

什么是Firewalld 当前很多linux系统中都默认使用 firewalld&#xff08;Dynamic Firewall Manager of Linux systems&#xff0c;Linux系统的动态防火墙管理器&#xff09;服务作为防火墙配置管理工具。 “firewalld”是firewall daemon。它提供了一个动态管理的防火墙&#x…...

2023年最新大厂开发面试题(滴滴,华为,京东,腾讯,头条)

2023年最新大厂开发面试题&#xff01;&#xff01;&#xff01; 滴滴篇 B树、B-树的区别? 数据库隔离级别&#xff0c;幻读和不可重复读的区别&#xff1f; 有 hell, well, hello, world 等字符串组&#xff0c;现在问能否拼接成 helloworld&#xff0c;代码实现。 快排算…...

2023年三月份图形化三级打卡试题

活动时间 从2023年3月1日至3月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…...

从零搭建私有物联网网络:LoRaWAN服务器实战指南

从零搭建私有物联网网络&#xff1a;LoRaWAN服务器实战指南 【免费下载链接】lorawan-server Compact server for private LoRaWAN networks 项目地址: https://gitcode.com/gh_mirrors/lo/lorawan-server 在物联网部署浪潮中&#xff0c;私有服务器搭建已成为企业和开发…...

数字化社交与营销突围:二维彩虹赋能电子名片与私域引流

在移动互联网深度渗透的今天&#xff0c;企业与个人面临的流量竞争日益激烈。传统的社交方式与营销手段正遭遇瓶颈&#xff1a;纸质名片易丢失、信息更新滞后&#xff1b;微信群二维码7天有效期导致流量流失&#xff1b;多平台推广链接分散&#xff0c;难以形成合力。面对这些痛…...

避坑指南:TDengine开源版taosdump备份恢复,这些性能问题和‘缺口’你得知道

TDengine开源版备份恢复实战&#xff1a;taosdump性能瓶颈与数据缺口深度解析 1. 当开源版遇上生产环境&#xff1a;taosdump的真实表现 去年夏天&#xff0c;我们团队在新能源监控项目中首次尝试用TDengine开源版构建时序数据库集群。当系统运行三个月后&#xff0c;客户突然…...

Kazumi:自定义规则驱动的动漫资源聚合与播放方案

Kazumi&#xff1a;自定义规则驱动的动漫资源聚合与播放方案 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP&#xff0c;支持流媒体在线观看&#xff0c;支持弹幕。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi Kazumi作为一款基于自定义规则的开源番剧…...

AudioSeal小白入门:无需代码,用90年代复古界面快速加密你的音频

AudioSeal小白入门&#xff1a;无需代码&#xff0c;用90年代复古界面快速加密你的音频 1. 什么是AudioSeal&#xff1f; AudioSeal是Meta公司开发的一款前沿音频水印技术&#xff0c;它能在不影响音质的前提下&#xff0c;将数字签名"隐形"嵌入到音频文件中。想象…...

视觉定位模型Chord实战:基于Qwen2.5-VL,快速搭建多模态目标检测服务

视觉定位模型Chord实战&#xff1a;基于Qwen2.5-VL&#xff0c;快速搭建多模态目标检测服务 1. 项目概述 视觉定位技术正在改变我们与图像交互的方式。Chord模型基于Qwen2.5-VL多模态大模型&#xff0c;能够理解自然语言指令并在图像中精确定位目标对象。想象一下&#xff0c…...

AIGC内容创作流水线:Qwen3-ASR-0.6B赋能语音素材自动化文本化

AIGC内容创作流水线&#xff1a;Qwen3-ASR-0.6B赋能语音素材自动化文本化 你有没有过这样的经历&#xff1f;录完一段精彩的课程讲解、一次深度的访谈对话&#xff0c;或者一段灵光乍现的语音随笔&#xff0c;看着长达几十分钟的音频文件&#xff0c;一想到要把它整理成文字稿…...

告别硬件!用Proteus8.9和VSPD虚拟串口,5分钟搞定51单片机串口通信仿真

零成本玩转51单片机串口通信&#xff1a;Proteus与VSPD虚拟串口实战指南 记得刚接触单片机开发时&#xff0c;最头疼的就是硬件问题——买开发板要钱&#xff0c;买USB转串口模块要钱&#xff0c;连杜邦线都得精打细算。直到发现ProteusVSPD这对黄金组合&#xff0c;才明白原来…...

AlwaysOnTop窗口置顶工具:3大突破性功能重塑你的多任务工作流

AlwaysOnTop窗口置顶工具&#xff1a;3大突破性功能重塑你的多任务工作流 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在当今数字化工作环境中&#xff0c;我们每天平均需要切…...

思博伦TestCenter打流丢包?别急着甩锅设备,先看看这个20字节的‘隐形签名’

思博伦TestCenter打流丢包&#xff1f;别急着甩锅设备&#xff0c;先看看这个20字节的‘隐形签名’ 当你在深夜的机房里盯着思博伦TestCenter的测试报告&#xff0c;发现RFC2544吞吐量测试结果突然归零&#xff0c;而端口统计与流统计的数值差异大得离谱时&#xff0c;那种抓狂…...