设计模式一: 模板方法模式 (Template Method Pattern)

模板方法模式是一种行为设计模式,它通过定义一个算法的骨架,而将一些步骤延迟到子类中实现。Template Method 使得子类可以不改变(复用)一个算法结构 即可重定义(override 重写)该算法的某些特定步骤。

基本结构

// 抽象类定义模板方法和基本操作
class AbstractClass {
public:// 模板方法,定义算法骨架(通常声明为final防止子类覆盖)void templateMethod() const {this->baseOperation1();this->requiredOperation1();this->baseOperation2();this->requiredOperation2();}// 基类中已实现的操作void baseOperation1() const {std::cout << "AbstractClass: 执行基础操作1\n";}void baseOperation2() const {std::cout << "AbstractClass: 执行基础操作2\n";}// 需要子类实现的纯虚函数virtual void requiredOperation1() const = 0;virtual void requiredOperation2() const = 0;// 虚析构函数virtual ~AbstractClass() = default;
};

开发人员只需继承AbstractClass  重写其中的虚函数然后调用templateMethod()即可

/ 具体实现类1
class ConcreteClass1 : public AbstractClass {
public:void requiredOperation1() const override {std::cout << "ConcreteClass1: 实现操作1\n";}void requiredOperation2() const override {std::cout << "ConcreteClass1: 实现操作2\n";}
};// 具体实现类2(带钩子方法覆盖)
class ConcreteClass2 : public AbstractClass {
public:void requiredOperation1() const override {std::cout << "ConcreteClass2: 实现操作1\n";}void requiredOperation2() const override {std::cout << "ConcreteClass2: 实现操作2\n";}void hook() const override {std::cout << "ConcreteClass2: 覆盖钩子方法\n";}
};

具体调用

int main() {std::cout << "同一客户端代码可以处理不同子类:\n";AbstractClass *concreteClass1 = new ConcreteClass1();concreteClass1->templateMethod();std::cout << "\n同一客户端代码可以处理不同子类:\n";AbstractClass *concreteClass2 = new  ConcreteClass2();concreteClass2->templateMethod();return 0;
}

uml图

应用场景

  1. 框架设计:定义框架的流程,允许用户自定义特定步骤

  2. 算法骨架固定:当多个类有相似算法但实现细节不同时

  3. 代码复用:将公共行为提取到父类中

  4. 控制子类扩展:限制子类只能修改算法的特定部分

优点

  1. 提高代码复用性,避免重复代码

  2. 良好的扩展性,符合开闭原则

  3. 便于维护,算法修改只需在父类中进行

  4. 反向控制结构,父类控制整体流程

缺点

  1. 每个不同的实现都需要一个子类,可能导致类数量增加

  2. 通过继承实现,可能违反组合优于继承的原则

  3. 父类与子类之间紧密耦合

实际应用示例

  1. STL中的分配器(allocator):定义内存分配算法框架

  2. GUI框架:如窗口显示流程固定,具体绘制由子类实现

  3. 单元测试框架:定义测试流程(setUp, test, tearDown)

  4. 编译器设计:编译流程固定,具体语法分析等步骤可变

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

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

相关文章

Linux驱动学习day24(UART子系统)

一、UART硬件理论1.1 作用及功能UART&#xff1a;通用异步收发传输器&#xff0c;简称串口。功能&#xff1a;移植u-boot、内核时&#xff0c;主要使用串口查看打印信息。外接各种模块&#xff0c;比如蓝牙GPS模块。使用UART的时候&#xff0c;要注意1. 波特率 2. 格式&#xf…

NFS共享服务器

目录 任务要求 思路总结 1.NFS共享服务 服务端 (ip 192.168.48.128) 客户端 (ip 192.168.48.130) 2.配置autofs自动挂载 任务要求 1.NFS服务器,可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中看来&#xff0c;那个远程主机的目…

FreeRTOS学习笔记之队列

小编正在学习嵌入式软件&#xff0c;目前建立了一个交流群&#xff0c;可以留下你的评论&#xff0c;我拉你进群一、简介队列是为了任务与任务、任务与中断之间的通信而准备的&#xff0c;可以在任务与任务、任务与中断之间消息传递&#xff0c;队列中可以存储有限的、大小固定…

垃圾收集器-ZGC

前言在Java开发中&#xff0c;垃圾收集器的选择对系统性能有着致命的影响。Java 8后&#xff0c;虽然G1 GC成为默认&#xff0c;但是它在延迟性控制上仍有限。ZGC作为最新一代高性能低延迟垃圾收集器&#xff0c;解决了CMS和G1在延迟、垃圾堆容量和吞吐量方面的重大突破。本文将…

计算机“十万个为什么”之跨域

计算机“十万个为什么”之跨域 本文是计算机“十万个为什么”系列的第五篇&#xff0c;主要是介绍跨域的相关知识。 作者&#xff1a;无限大 推荐阅读时间&#xff1a;10 分钟 一、引言&#xff1a;为什么会有跨域这个“拦路虎”&#xff1f; 想象你正在参观一座戒备森严的城堡…

C语言:20250719笔记

字符数组在C语言中&#xff0c;支持字符串常量&#xff0c;不支持字符串变量。如果想要实现类似的字符串变量&#xff0c;C语言提供了两种实现方式&#xff1a;字符数组&#xff1a;char name[] “哪吒”&#xff1b;字符指针&#xff1a;char *name "娜吒"&#x…

decltype是什么,什么作用?

基本概念decltype 是 C11 引入的关键字&#xff0c;用于推导表达式的类型&#xff0c;且会完整保留类型的细节&#xff08;包括 const、引用 &、指针 * 等&#xff09;。语法:decltype(表达式) 变量名核心特点1.推导依据是表达式本身&#xff0c;而非表达式的结果&#xff…

RPC 与 Feign 的区别笔记

一、基本概念 1.1 RPC&#xff08;Remote Procedure Call&#xff09; 定义&#xff1a;远程过程调用&#xff0c;允许像调用本地方法一样调用远程服务的方法。 本质&#xff1a;跨进程通信&#xff0c;隐藏了底层网络通信的复杂性。 常见实现&#xff1a; Java 原生 RMIDub…

高防IP能够防御CC攻击吗?它具备哪些显著优势?

摘要&#xff1a; 面对日益复杂的网络攻击&#xff0c;高防IP作为重要的安全工具&#xff0c;不仅能防御常见的DDoS攻击&#xff0c;还能有效应对CC攻击。本文将解析高防IP防御CC攻击的原理及其核心优势&#xff0c;帮助读者了解其在网络安全中的关键作用。一、高防IP能否防御C…

TypeScript 类型注解(一)

一、TypeScript 类型注解1、什么是TpyeScript类型注解- 是否还记得TypeScript的两个重要特性&#xff1f;- 类型系统、适用于任何规模- 可以说&#xff0c;TS的类型系统是TS最重要的功能&#xff1b;那么什么是类型注解呢&#xff1f;其实就是在声明变量时&#xff0c;将变量的…

弗兰肯斯坦式的人工智能与GTM策略的崩溃

2025 年上半年已经明确了一件事&#xff1a;B2B 市场营销团队被工具淹没&#xff0c;但缺乏策略。人工智能无处不在。收入领导者在进行无休止的试点。营销团队拼凑各种点解决方案&#xff0c;希望能实现规模扩张。然而&#xff0c;销售线索的增长停滞不前。信誉正在受损。曾经承…

NAND闪存(NAND Flash)是什么?

NAND闪存(NAND Flash)是什么? NAND闪存(NAND Flash)详解 NAND闪存是一种非易失性存储介质(断电不丢失数据),广泛应用于SSD、U盘、手机存储等设备中。NAND Flash 的全称是 “Negative-AND Flash”(与非型闪存),其名称源自其底层存储单元的电路结构——基于**“与非门…

Android性能优化之UI渲染优化

一、UI渲染核心瓶颈深度解析 1. 渲染管线关键阶段阶段CPU工作GPU工作潜在卡顿点Measure计算View尺寸-嵌套布局多次测量Layout计算View位置-频繁重排(Relayout)Draw构建DisplayList指令集-复杂自定义View.onDraw()Sync & Upload资源上传到GPU内存纹理上传大图/未压缩资源Ras…

基于Spring AI Alibaba的智能知识助手系统:从零到一的RAG实战开发

&#x1f4d6; 项目概述 在人工智能快速发展的今天&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术已成为构建智能问答系统的核心技术。本文将详细介绍一个基于Spring AI Alibaba DashScope深度集成的智能知识助手系统的完整开发过程&#xff0c;…

VirtualBox + CentOS:启用 DHCP 获取 IPv4 地址

标题&#xff1a; VirtualBox CentOS&#xff1a;启用 DHCP 获取 IPv4 地址 日期&#xff1a; 2025-07-18 一、问题现象 最小化安装的 CentOS 7 虚拟机里敲&#xff1a; ip addr输出只有 lo 的 127.0.0.1 以及 enp0s3 的 IPv6 链路本地地址&#xff0c;没有 IPv4&#xff0…

Git

Git简介Git 是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git 仓库来存储和管理这些文件&#xff0c;Git 仓库分为两种:本地仓库:开发人员自己电脑上的 Git仓库。远程仓库:远程服务器上的 Git 仓库。commit: 提交, 将本地文件和版本…

通信算法之294:LTE系统中的整数倍频偏估计

在LTE系统中&#xff0c;整数倍频偏估计主要通过以下方法实现&#xff1a;一、最大似然估计法&#xff08;ML&#xff09;通过遍历预设的整数倍频偏范围&#xff08;如30kHz&#xff09;&#xff0c;将接收信号与本地的PSS序列在不同频偏点上进行相关运算&#xff0c;选择相关峰…

数字人直播:开启直播行业新纪元​

​原始尺寸更换图片p9-flow-imagex-sign.byteimg.com​​在科技日新月异的当下&#xff0c;直播行业正经历着一场深刻变革&#xff0c;数字人直播的兴起&#xff0c;宛如一颗璀璨新星&#xff0c;照亮了直播领域的新征程。数字人直播&#xff0c;是利用先进的人工智能技术&…

朝鲜升级供应链恶意软件XORIndex,再次瞄准npm生态系统

Socket威胁研究团队最新披露&#xff0c;朝鲜国家支持的黑客组织在"传染性面试"攻击活动中采用了新型恶意软件加载器XORIndex&#xff0c;该恶意程序专门通过npm软件包注册表渗透软件供应链。攻击规模与持续性此次攻击并非孤立事件&#xff0c;而是针对开发者、求职者…

Windows 下 VS2019 编译 libevent-2.1.10 库

1. 你需要VS2019 编译好openssl-1.1.1 &#xff0c;这个具体编译或者下载可以参考我的博客openssl生成的库是这两个文件接下来&#xff0c;打开CMake &#xff0c;主要是下面的需要设置好最后Config Generate即可&#xff1b;全部成功生成 22个然后INSTALL右键生成 最后看下生…