设计模式之模板方法
模式定义
定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。
——《设计模式》GoF
理解:模板方法就是将固定算法流程实现放在父类中实现,将固定流程中的可能变化的步骤定义为虚方法,子类可重写(实现晚绑定)。对于不变的步骤,和算法的实现流程,子类不必关心。子类也不需要关心整个算法实现流程。实现子类的稳定。
示例
整个代码框架:

代码说明
1:在父类greet中定义了方法method1();method2(); method3(); 其中 method1();method3()为greet类的非虚函数。在greet类中实现。method2()为纯虚函数,需要在子类中实现。
class greet{
public:greet() {}virtual ~greet(){}public:virtual void method2() = 0;private:void method1();void method3();
protect:void greetProcess();
};
整个算法调用的接口在父类中定义和实现
void greet::greetProcess(){method1();method2();method3();
}
派生类myGreet 继承 greet类,并且重写方法method2
class myGreet : public greet{
public:myGreet() {}~myGreet(){}private:void method2();
};
#endif
在源文件myMain.cpp 中定义基类指针指向派生类,并且调用基类中的算法流程接口
int main(){greet *baseGreet = new myGreet;baseGreet->greetProcess();delete baseGreet;return 0;
}
代码编译:在buildSh目录下面运行myBuild.sh
运行:buildSh目录下面执行myStart.sh
清理编译文件:buildSh目录下面执行myClean.sh
源码下载地址:设计模式之模板方法测试代码
一个经典的 C++ 源码示例涉及使用模板方法设计模式的场景是 GUI 框架的开发。在这样的框架中,通常会有一个基类定义了一些通用的行为和算法,而具体的子类可以根据需要来实现特定的功能或定制化。
#include <iostream>// GUI 元素基类
class UIElement {
public:// 模板方法:渲染void render() {// 绘制背景drawBackground();// 绘制内容drawContent();// 绘制边框drawBorder();}protected:// 子类必须实现的抽象方法:绘制内容virtual void drawContent() = 0;// 可选的钩子方法:绘制背景,默认实现为空virtual void drawBackground() {}// 可选的钩子方法:绘制边框,默认实现为空virtual void drawBorder() {}
};// 具体的按钮类
class Button : public UIElement {
protected:// 实现绘制内容的具体算法void drawContent() override {std::cout << "Button: Drawing content." << std::endl;}// 实现绘制背景的具体算法void drawBackground() override {std::cout << "Button: Drawing background." << std::endl;}// 实现绘制边框的具体算法void drawBorder() override {std::cout << "Button: Drawing border." << std::endl;}
};// 具体的文本框类
class TextBox : public UIElement {
protected:// 实现绘制内容的具体算法void drawContent() override {std::cout << "TextBox: Drawing content." << std::endl;}// 实现绘制背景的具体算法void drawBackground() override {std::cout << "TextBox: Drawing background." << std::endl;}
};int main() {// 创建一个按钮并渲染Button button;std::cout << "Rendering button:" << std::endl;button.render();std::cout << std::endl;// 创建一个文本框并渲染TextBox textBox;std::cout << "Rendering text box:" << std::endl;textBox.render();return 0;
}
在这个示例中,UIElement 类定义了一个模板方法 render(),它包含了一个固定的渲染算法框架。具体的子类(如 Button 和 TextBox)通过实现抽象方法 drawContent() 来定制化自己的渲染内容,而可选的钩子方法 drawBackground() 和 drawBorder() 则允许子类根据需要选择性地覆盖默认行为。
通过使用模板方法设计模式,GUI 框架可以提供一个通用的渲染算法框架,并允许具体的子类在不同的情况下定制化自己的行为,从而实现了代码的灵活性和可扩展性。
相关文章:
设计模式之模板方法
模式定义 定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。 …...
Tubi 故事|中国团队本地管理队伍的形成
当一支团队在公司核心业务中发挥着越来越重要的作用,他们将会获得更多资源以支持团队的发展并在核心业务中持续贡献。相应地,公司也需要投入更多的精力去管理这支规模日渐壮大的团队,尤其当这支远程团队与公司总部在地理和文化上有明显差异时…...
微服务篇之任务调度
一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了,重试和统计。 4. 任务量大,分片执行。 二、xxl-job路由策略 1. FIRST(第一个):固定选择第一个机器。 2. LAST&#x…...
提取游戏音频文件.bnk
提取游戏音频文件.bnk 什么是.bnk准备Wwise-Unpacker工具使用Wwise-Unpacker工具总结 什么是.bnk .bnk其实是一种对音频的加密方式,一个.bnk文件中通常包含了多个语音文件,一般可以使用Wwise-Unpacker来解码.bnk格式文件 准备Wwise-Unpacker工具 Wwis…...
React 模态框的设计(三)拖动组件的完善
我在上次的Draggable组件的设计中给了一个简化的方法,今天我来完善一下这个组件,可用于任何可移动组件的包裹。完善后的效果如下所示: 这个优化中,增加了一个注目的效果,还增加了触发可拖动区域的指定功能,…...
wondows10用Electron打包threejs的项目记录
背景 电脑是用的mac,安装了parallels desktop ,想用electron 想同时打包出 苹果版本和windows版本。因为是在虚拟机里安装,它常被我重装,所以记录一下打包的整个过程。另外就是node生态太活跃,几个依赖没记录具体版本࿰…...
git的master、develop、feature分支分别是做什么用的?有什么区别和联系?
在Git版本控制系统中,master、develop和feature分支都是常用的分支类型,它们有不同的用途和特点。 master分支:master分支是Git默认的主分支,它包含了项目的稳定版本。通常,master分支用于发布正式版本,即经…...
前端基础面试题
摘要:最近,看了下慕课2周刷完n道面试题,记录下... 1.请说明Ajax、Fetch、Axios三者的区别 三者都用于网络请求,但维度不同: Ajax(Asynchronous Javascript ang XML),是一种在不重新…...
docker自定义网络实现容器之间的通信
Background docker原理 docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。docker核心三大组件:image–镜像、container-容器、 repository-仓库。docker使用的cpu、内存以及系统内核等资源都是直接使用宿主…...
NLP_构建GPT模型并完成文本生成任务
文章目录 搭建GPT模型(解码器)构建文本生成任务的数据集训练过程中的自回归文本生成中的自回归(贪婪搜索)完整代码小结 搭建GPT模型(解码器) GPT 只使用了 Transformer的解码器部分,其关键组件…...
使用puppeteer完成监听浏览器下载文件并保存到自己本地或服务器上完成上传功能
需求场景 获取网站点击的下载pdf,并把pdf重命名再上传到COS云上面 技术使用 “puppeteer”: “^19.7.2”, “egg”: “^3.15.0”, // 服务期用egg搭的 文件服务使用COS腾讯云 核心思路 获取浏览器下载事件,并把文件保存到本地 const session awai…...
软件压力测试:测试方法与步骤详解
随着软件应用的不断发展,用户对系统性能的要求也逐渐提高。在不同的负载条件下,系统必须能够保持稳定、高效的运行。软件压力测试是一种验证系统在各种负载情况下性能表现的关键手段。本文将详细探讨软件压力测试的方法和步骤。 1. 明确测试目标 在进行压…...
Oerlikon欧瑞康LPCVD system操作使用说明
Oerlikon欧瑞康LPCVD system操作使用说明...
pyspark统计指标计算
下面介绍如何使用pyspark处理计算超大数据的统计指标,主要为:最大值、最小值、均值、方差、标准差、中位数、众数、非重复值等。 # 加载稽核数据 rd_sql f"select * from database.table" spark_data spark.sql(rd_sql)# 计算众数 由于spar…...
2.22号qt
1.使用信号和槽实现多个界面跳转 1.1准备两个界面 1.2第一个界面准备signal 1.3第二个界面准备slot 1.4将第一个界面的信号和槽进行连接 2.qss登录界面升级优化 2.1概念 Qss是Qt程序界面中用来设置控件的背景图片、大小、字体颜色、字体类型、按钮状态变化等属性ÿ…...
$attrs
一、概念 vue官网定义如下: 包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过v-bind="$attrs"传入内部组件——在创建…...
OS X(MACOS) C/C++ 遍历系统所有的IP路由表配置。
以下源实现为遍历MAC苹果电脑系统上配置的所有IP路由表配置,回调 predicate 过滤函数只在 AF_INET(IPV4)的时候跳出,其它时不处理,人们可以根据自己的需求改动。 无需依赖MAC OS框架库提供的函数,最小依赖才有可能更容易移植代码到…...
人工智能_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_003---人工智能工作笔记0098
前面的环境安装差不多了,这里我没有安装git,因为我认为用不到,好下面去下载算法: 首先是算法下载: https://codeload.github.com/THUDM/ChatGLM-6B/zip/refs/heads/main 算法的下载连接是这里: 可以看到下载以后得到这个ChatGLM-6B-main这个算法压缩包 然后我们再去: 然后…...
基于JAVA的实验室耗材管理系统 开源项目
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…...
NXP实战笔记(七):S32K3xx基于RTD-SDK在S32DS上配置ICU输入捕获
目录 1、概述 2、输入捕获SDK配置 2.1、SAIC中断方式 2.2、IPWM或者IPM 1、概述 输入捕获,可以抓取高电平时间、低电平时间、占空比、周期、边沿检测与回调函数、边沿计数(ABZ解码)、时间戳、唤醒中断。 记录一下根据Emios模块实现上述部分…...
记一次 mac openClaw gateway 启动未正常关闭导致的问题
openclaw 目前是一个比较火的 AI 工具,因为其高权限带来了一系列的风险和安全隐患按照官方步骤删除后,因open claw 的 gateway 没有正常关闭,导致端口一直在后台运行如果您也遇到类似的问题,可在 mac 终端执行如下命令进行关闭1.先…...
如何用Winhance一键优化Windows系统?完整免费指南
如何用Winhance一键优化Windows系统?完整免费指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...
FPGA存储资源怎么选?一张图看懂LUTRAM、BRAM和URAM的适用场景与性能差异
FPGA存储资源选型指南:LUTRAM、BRAM与URAM的深度对比与实战选择 在FPGA设计的世界里,存储资源的选择往往决定了整个系统的性能和效率。想象一下,你正在为一个高性能图像处理系统设计FPGA架构,需要在片上实现一个容量为128Kb的帧缓…...
为 OpenClaw 智能体工作流配置 Taotoken 作为其大模型供应商
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为 OpenClaw 智能体工作流配置 Taotoken 作为其大模型供应商 在构建基于 OpenClaw 框架的 AI 智能体工作流时,开发者通…...
告别标注烦恼!用DINO+ViT自监督训练,5步搞定你的图像特征提取器(附代码)
5步实战DINOViT自监督训练:零标注构建高效图像特征提取器 在计算机视觉领域,数据标注一直是制约模型性能提升的瓶颈。传统监督学习需要大量人工标注数据,而高质量标注不仅成本高昂,还可能引入人为偏见。自监督学习(self-supervise…...
发现安卓应用宝库:APKMirror客户端让你安全下载任何版本应用
发现安卓应用宝库:APKMirror客户端让你安全下载任何版本应用 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 还记得上次为了找一个旧版本的微信,在各种论坛里翻来覆去地找,最后下载的APK文件还让…...
从单摆到机械臂:拉格朗日方程如何统一描述‘运动与力’?一个思维模型讲透
从单摆到机械臂:拉格朗日方程如何统一描述‘运动与力’?一个思维模型讲透 想象你手中握着一根细绳,末端悬挂着一个小球。轻轻推动它,小球便开始左右摆动——这就是经典的单摆系统。看似简单的运动背后,却隐藏着自然界最…...
RK3566安卓11开发板千兆网卡RTL8211F移植避坑指南:从原理图到DTS配置全流程
RK3566安卓11平台RTL8211F千兆网卡移植实战:硬件原理到DTS配置的深度解析 当开发者需要在RK3566安卓11平台上实现千兆以太网功能时,RTL8211F PHY芯片的移植往往成为关键挑战。不同于简单的驱动加载,实际项目中常会遇到"软件配置看似正常…...
Win10下通过桥接网卡实现QEMU虚拟机与宿主机及外网的无缝互联
1. 为什么需要桥接网卡? 在Windows 10环境下使用QEMU创建虚拟机时,很多朋友都会遇到一个头疼的问题:虚拟机虽然能上网,但宿主机和虚拟机之间就是无法互相访问。这种情况我遇到过太多次了,特别是需要调试web服务或者进行…...
EPUBCheck测试框架深度解析:单元测试和集成测试最佳实践
EPUBCheck测试框架深度解析:单元测试和集成测试最佳实践 【免费下载链接】epubcheck The conformance checker for EPUB publications 项目地址: https://gitcode.com/gh_mirrors/ep/epubcheck EPUBCheck作为EPUB出版物的官方一致性检查工具,其强…...
