C++设计模式之模板方法、策略模式、观察者模式
面向对象设计模式是”好的面向对象设计“,所谓”好的面向对象设计“指的是可以满足”应对变化,提高复用“的设计。
现代软件设计的特征是”需求的频繁变化“。设计模式的要点是”寻求变化点,然后在变化点处应用设计模式,从而更好地应对需求的变化“。”什么时候,什么地点应用设计模式“比设计模式结构本身”更重要。
重构关键技巧:
静态->动态
早绑定->晚绑定
继承->组合
编译时依赖->运行时依赖
紧耦合->松耦合
“组件协作”模式:
现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚绑定来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
典型的有:模板方法,策略模式,观察者模式
一、模板方法(Template Method)
动机:
在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固定的原因而无法和任务的整体结构同时实现。
那么如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求呢?
例子:
实现一个整体框架固定,但有两个步骤的具体实现多变的程序。
方法一:



该方法将整体框架写在主函数里,应用程序和框架分开写。

方法二:




该方法将整体运行框架也写在库里面,并且将由应用程序定义的步骤写成虚函数,让应用程序开发人员来重写,以实现晚绑定的效果。

模式定义:
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。
结构:

总结:
Template Method模式是一种非常基础的设计模式,在面向对象系统中有大量的应用。它用最简单的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
二、策略模式(Strategy)
动机:
在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编写到对象中,将会使对象变得异常复杂,而且有时支持不使用的算法也是一个性能负担。
那么如何在运行时根据需要透明地更改对象的算法,将算法与对象本身解耦,从而避免上述问题呢?
例子:
实现一个计算税收的类,根据不同的国家有不同的计算方法。
方法一:

该方法是最容易想到的,利用一系列if..else来选择不同的算法。但是这样一旦有新的需求就需要修改源代码,这不符合开放封闭原则。
方法二:

该方法将算法写成一个接口,在类里通过多态实现算法的晚绑定,这样在有新的需求时只需写一个类实现接口即可,符合开闭原则。
模式定义:
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它们的客户程序(稳定)而变化(扩展,子类化)。
结构:

总结:
Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
Strategy模式提供了用条件判断语句外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常需要Strategy模式。
三、观察者模式(Observer)
动机:
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象的状态发生变化,所有的依赖对象都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。
使用面向对象技术,可以将这种依赖关系淡化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
例子:
实现一个分割文件的类,希望能通过进度条等方式看到分割的进度。
方法一:


该方法直接绑定到一个进度条的类,这不符合依赖倒置原则,当需要其他方式表示进度的时候需要修改代码。
方法二:





这种方法既可以实现松耦合,又可以使用多种通知方式。
模式定义:
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
结构:

总结:
使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
目标发送通知时,无需指定观察者,通知会自动传播。
观察者自己决定是否需要订阅通知,目标对象对此一无所知。
Observer模式是基于事件的UI框架中非常常用的设计模式,也是MVC模式的一个重要组成部分。
相关文章:
C++设计模式之模板方法、策略模式、观察者模式
面向对象设计模式是”好的面向对象设计“,所谓”好的面向对象设计“指的是可以满足”应对变化,提高复用“的设计。 现代软件设计的特征是”需求的频繁变化“。设计模式的要点是”寻求变化点,然后在变化点处应用设计模式,从而更好地…...
【计算机网络 02】物理层基本概念 传输媒体 传输方式 编码与调制 信道极限容量 章节小结
第二章 -- 物理层 2.1 物理层基本概念2.2 物理层下的传输媒体2.3 传输方式2.4 编码与调制2.5 信道极限容量2.6 章节小结 2.1 物理层基本概念 2.2 物理层下的传输媒体 传输媒体也称为传输介质或传输媒介,他就是数据传输系统中在发送器和接收器之间的物理通路 传输媒…...
无涯教程-jQuery - serialize( )方法函数
serialize()方法将一组输入元素序列化为数据字符串。 serialize( ) - 语法 $.serialize( ) serialize( ) - 示例 假设无涯教程在serialize.php文件中具有以下PHP内容- <?php if( $_REQUEST["name"] ) {$name$_REQUEST[name];echo "Welcome ". $na…...
一套不错的基于uniapp实现的投票类小程序/H5
最近作者心血来潮,想做一个热点话题投票,话题相关的资讯跟踪类的小程序,方便自己发布一些大家比较关心的话题。 基于以上需求,说干就干,首先需要定义一个需求: 1、支持热门话题投票、排行榜(日…...
Mac代码编辑器sublime text 4中文注册版下载
Sublime Text 4 for Mac简单实用功能强大,是程序员敲代码必备的代码编辑器,sublime text 4中文注册版支持多种编程语言,包括C、Java、Python、Ruby等,可以帮助程序员快速编写代码。Sublime Text的界面简洁、美观,支持多…...
django------模糊查询
1.常用模糊查询的方法 queryset中支持链式操作 bookBook.objects.all().order_by(-nid).first() 只要返回的是queryset对象就可以调用其他的方法,直到返回的是对象本身 大于、大于等于、小于、小于等于: # __gt 大于> # __gte 大于等于> # __lt 小于< …...
AVFoundation - 音视频组合编辑
文章目录 一、简要说明二、使用1、音频和视频合成2、视频的拼接一、简要说明 相关类 AVMutableCompositionAVMutableCompositionTrack二、使用 1、音频和视频合成 - (void)testCom1{AVMutableComposition *mutableComposition = [AVMutableComposition composition];AVMu...
jpa生成实体类,jpa根据数据库表生成实体类
jpa生成实体类,jpa根据数据库表生成实体类jpa根据数据库表结构生成实体idea下SpringbootJPA从数据库自动生成实体类JPA用数据库表直接生成实体类Spring boot整合jpa(一),根据表生成实体IDEA下SpringData-JPA根据数据库表生成实体类idea怎么根据数据库表自动生成JPA实…...
嵌入式Linux系统组成
嵌入式Linux系统的组成 文章目录 嵌入式Linux系统的组成一、发行版Linux系统VS嵌入式Linux系统二、嵌入式Linux系统架构一、发行版Linux系统VS嵌入式Linux系统 1.产品 发行版Linux系统产品:服务器、消费平板、消费手提电脑 嵌入式Linux系统产品:扫地机器人,小米机顶盒特定场…...
【iOS】—— RunLoop和多线程相关问题总结
RunLoop 1. 讲讲RunLoop,项目中有用到过吗? RunLoop 的基本作用:保持程序的持续运行,节省 CPU 的资源,提高程序的性能 ( 没有事情,就请休眠,不要功耗。有事情,就处理&a…...
在CSDN学Golang云原生(gitlab)
一,基于Docker安装gitlab runner 在Golang中,基于Docker安装GitLab Runner需要以下步骤: 首先,您需要安装Docker和Docker Compose。这可以通过访问官方网站来完成。接下来,您需要创建一个名为docker-compose.yml的文…...
cv2抛出异常 “install libgtk2.0-dev and pkg-config, then re-run cmake or configure”
背景: linux中使用cv2显示图片的时候,运行提示异常: 处理方式: 网友的推荐操作: 切换至root模式安装 apt-get install libgtk2.0-dev进入OpenCV下载目录,重新编译 cd /home/XXX/opencv mkdir release …...
C#..上位机软件的未来是什么?
C#是一种流行的编程语言,广泛应用于桌面应用程序和上位机软件开发。未来,C#上位机软件将继续不断发展和创新,以满足用户日益增长的需求。以下是我认为C#上位机软件未来可能会涉及的一些方向: 更加智能化:随着人工智能…...
CentOS 搭建 GitLab Git
本文目录 1. CentOS7 搭建 Gitlab1. 安装 sshd1. 安装 sshd 依赖2. 启动并设置开机自启3. 安装防火墙4. 开启防火墙5. 开放 ssh 以及 http 服务 2. 安装 postfix1. 安装 postfix2. 启动并设置开机自启3. 几个补充知识 3. 下载并安装 gitlab1. 在线下载安装包2. 安装 4. 修改 gi…...
【MTK平台】【wpa_supplicant】关于wpa_supplicant_8/src/p2p/p2p_go_neg.c文件的介绍
本文主要介绍external/wpa_supplicant_8/src/p2p/p2p_go_neg.c文件 这里主要介绍2个方法 1. p2p_connect_send接受来自 p2p.c 文件中调用p2p_connect方法发送的GON Request帧 2. p2p_process_go_neg_resp处理来自GON Response帧的处理流程 先看下p2p_connect_send方法 int p…...
win11安装appium
node安装 node下载网址: Download | Node.js 安装后对node安装包路径进行配置 npm config set prefix “E:\nodejs\node_global” //设置全局包目录 npm config set cache “E:\nodejs\node_cache” //设置缓存目录npm config list //查看npm配置npm install -g appium //安…...
数据科学、统计学、商业分析
数据科学、统计学、商业分析是在各方面有着不同的侧重和方向的领域。 1.专业技能 数据科学(Data Science):数据科学涉及从大量数据中提取有价值的信息、模式和洞察力的领域。它使用多种技术和领域知识,如统计学、机器学习、数据库…...
【多模态】18、ViLD | 通过对视觉和语言知识蒸馏来实现开集目标检测(ICLR2022)
文章目录 一、背景二、方法2.1 对新类别的定位 Localization2.2 使用 cropped regions 进行开放词汇检测2.3 ViLD 三、效果 论文:Open-vocabulary Object Detection via Vision and Language Knowledge Distillation 代码:https://github.com/tensorflo…...
【AGI】Copilot AI编程辅助工具安装教程
1. 基础激活教程 GitHub和OpenAI联合为程序员们送上了编程神器——GitHub Copilot。 但是,Copilot目前不提供公开使用,需要注册账号通过审核,我也提交了申请:这里第一期记录下,开启教程,欢迎大佬们来讨论…...
Mac配置android studio的终端terminal
一共6步 首先打开terminal 1.echo $HOME 2.touch .bash_profile 3.open -e .bash_profile 4.在弹出框中输入 export PATH${PATH}:你电脑sdk的路径/tools:你电脑sdk的路径/platform-tools 5.source .bash_profile 6.adb version 出现类似上图即为成功...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
Nginx1.24编译时,报LuaJIT2.x错误, configuring additional modules adding module in /www/server/nginx/src/ngx_devel_kit ngx_devel_kit was configured adding module in /www/server/nginx/src/lua_nginx_module checking for LuaJIT 2.x ... not…...
机器学习复习3--模型评估
误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为:误差(error)。 误差定义: ①在训练集上的误差称为训练误差(training error)或经验误差(empirical error&#x…...
实现p2p的webrtc-srs版本
1. 基本知识 1.1 webrtc 一、WebRTC的本质:实时通信的“网络协议栈”类比 将WebRTC类比为Linux网络协议栈极具洞察力,二者在架构设计和功能定位上高度相似: 分层协议栈架构 Linux网络协议栈:从底层物理层到应用层(如…...
第6章:Neo4j数据导入与导出
在实际应用中,数据的导入与导出是使用Neo4j的重要环节。无论是初始数据加载、系统迁移还是数据备份,都需要高效可靠的数据传输机制。本章将详细介绍Neo4j中的各种数据导入与导出方法,帮助读者掌握不同场景下的最佳实践。 6.1 数据导入策略 …...
