设计模式之模板方法
模式定义
定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。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模块实现上述部分…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
