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

C++组合复用中,委托的含义与作用

委托(Delegation)的含义与作用

委托是一种软件设计技术,它允许一个对象在处理某个请求时,将请求的处理责任转移给另一个对象。委托的核心思想是通过组合(composition)而不是继承(inheritance)来实现代码复用。通过委托,对象可以将部分或全部职责委托给其他对象,而不是通过继承来重用代码。这种方式更加灵活,因为它避免了继承带来的类层次结构的复杂性和耦合性。

委托的作用

减少代码重复:通过委托,可以将通用的功能封装在独立的类中,然后由多个类通过组合的方式复用这些功能,避免代码重复。
提高灵活性:委托允许对象在不改变自身的情况下,动态地改变其行为。这是因为委托的对象可以在运行时动态改变。
降低耦合度:通过委托,对象之间的关系更加松散,减少了类与类之间的依赖,使得系统更容易维护和扩展。
支持策略模式:委托可以作为一种实现策略模式的方式,通过改变委托对象,可以动态地改变策略。


示例说明

假设我们有一个打印机的类,它可以根据不同的打印策略(如黑白打印和彩色打印)来处理打印任务。我们可以通过委托来实现这种功能。

#include <iostream>// 打印策略接口
class PrintStrategy {
public:virtual void print(const std::string& text) const = 0;
};// 黑白打印策略
class BlackWhitePrint : public PrintStrategy {
public:void print(const std::string& text) const override {std::cout << "黑白打印: " << text << std::endl;}
};// 彩色打印策略
class ColorPrint : public PrintStrategy {
public:void print(const std::string& text) const override {std::cout << "彩色打印: " << text << std::endl;}
};// 打印机类,使用委托来选择打印策略
class Printer {
private:PrintStrategy* strategy; // 委托对象public:Printer(PrintStrategy* strategy) : strategy(strategy) {}void setPrintStrategy(PrintStrategy* newStrategy) {strategy = newStrategy;}void printDocument(const std::string& text) {strategy->print(text);}
};int main() {BlackWhitePrint blackWhite;ColorPrint color;Printer printer(&blackWhite); // 初始使用黑白打印策略printer.printDocument("Hello, World!"); // 输出: 黑白打印: Hello, World!printer.setPrintStrategy(&color); // 改变打印策略为彩色打印printer.printDocument("Hello, World!"); // 输出: 彩色打印: Hello, World!return 0;
}


在这个例子中,Printer类通过委托PrintStrategy接口来处理打印任务。Printer类本身并不关心具体的打印策略是什么,它只是将打印任务委托给具体的策略对象。通过这种方式,我们可以在不修改Printer类的情况下,动态地改变打印策略。

C++软件设计模式中典型的委托使用情况

在C++的软件设计模式中,委托经常用于以下几种情况:

策略模式(Strategy Pattern):如上面的例子,策略模式通过委托来实现不同的算法或策略,使得算法可以在运行时动态改变。

装饰器模式(Decorator Pattern):装饰器模式通过委托来动态地给对象添加职责。装饰器类持有被装饰对象的引用,并通过委托调用被装饰对象的方法。

状态模式(State Pattern):状态模式通过委托来实现对象在不同状态下的不同行为。上下文类持有当前状态对象的引用,并通过委托调用状态对象的方法。

命令模式(Command Pattern):命令模式通过委托来实现对请求的封装。命令对象持有接收者的引用,并通过委托调用接收者的方法。

通过这些设计模式,委托技术在C++中得到了广泛的应用,帮助开发者构建更加灵活和可维护的软件系统。

相关文章:

C++组合复用中,委托的含义与作用

委托&#xff08;Delegation&#xff09;的含义与作用 委托是一种软件设计技术&#xff0c;它允许一个对象在处理某个请求时&#xff0c;将请求的处理责任转移给另一个对象。委托的核心思想是通过组合&#xff08;composition&#xff09;而不是继承&#xff08;inheritance&a…...

自制C++游戏头文件:C++自己的游戏头文件!!!(后续会更新)

引言 在这个数字时代&#xff0c;计算机游戏已经成为人们生活中不可或缺的一部分。它们不仅为我们带来了无尽的乐趣&#xff0c;还激发了我们的创造力和解决问题的能力。今天&#xff0c;我们将深入探讨一个特别的头文件——CPPgame.h&#xff0c;它包含了多个结构体和函数&am…...

java 读取 有时需要sc.nextLine();读取换行符 有时不需要sc.nextLine();读取换行符 详解

在 Java 中&#xff0c;使用 Scanner 类读取输入时&#xff0c;换行符的处理行为取决于所用的读取方法。不同方法的工作原理会影响是否需要额外调用 sc.nextLine() 来清理缓冲区中的换行符。 核心问题 根本原因&#xff1a;Scanner 是基于输入流工作的&#xff0c;而换行符&am…...

Redis知识分享(三)

目录 前言 七、事务管理 7.1事务中的异常处理 八、订阅发布 8.1概述 ​8.2.Redis针对发布订阅相关指令 九、主从复制 9.1主从复制概述 9.2.主从复制的用处 9.3主从复制实现原理 ​9.3.1.psync指令 9.3.2.复制偏移量 9.3.3复制积压缓冲区&节点ID 前言 今天…...

python安装包报错

多次安装均报错 ERROR: Could not find a version that satisfies the requirement win10toast ERROR: No matching distribution found for win10toast 然后还提示 WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connectio…...

Linux性能优化之火焰图简介

Linux 火焰图&#xff08;Flame Graph&#xff09;是一种可视化工具&#xff0c;用于分析程序性能问题&#xff0c;尤其是 CPU 使用情况。它展示了程序中函数调用的层次结构和各个调用栈占用的时间比例。 以下是详细介绍&#xff0c;包括火焰图的工作原理、生成步骤和实际使用中…...

Unity类银河战士恶魔城学习总结(P129 Craft UI 合成面板UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了合成面板的UI设置 UI_CraftWindow.cs 字段作用&#xff1a; UI 组件&#xff1a; itemName / itemDescription / icon&#…...

linux基础笔试练习题笔记(2)

在Linux系统上&#xff0c;下面那个命令不可以用来查看文件内容&#xff08;&#xff09; A.cat B.ls C.less D.more 答案解析&#xff1a; cat命令用用于一次性显示文件的所有内容&#xff0c;一般文件内容较多时一般会使用more或less命令。 more:分页显示文件内容&#xf…...

Android OpenGL ES详解——glTexImage2D方法

glTexImage2D是OpenGL中的一个重要函数&#xff0c;其作用是为2D纹理分配显存并上传数据。以下是关于glTexImage2D作用的详细解释&#xff1a; 一、函数原型 在OpenGL ES 2.0中&#xff0c;glTexImage2D的函数原型如下&#xff1a; GL_APICALL void GL_APIENTRY glTexImage2…...

Redisson 中开启看门狗(watchdog)机制

在分布式系统中&#xff0c;分布式锁是一种常用的技术手段&#xff0c;用于确保在多个节点同时访问共享资源时的一致性和正确性。Redisson 是一个强大的 Java 分布式框架&#xff0c;它提供了丰富的分布式数据结构和服务&#xff0c;其中开启看门狗&#xff08;watchdog&#x…...

【JSOO】设计模式

单例模式工厂模式状态模式观察者模式桥接模式 设计模式&#xff08;是一种通过经验中总结出来的经过反复验证能够解决一类通用问题的可以反复重用的就可称它为模式&#xff0c;否则只能称为功能模块&#xff09;&#xff1b;模式&#xff1a;把解决问题的方法抽取出来&#xff…...

本草纲目数字化:Spring Boot在中药实验管理中的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理中药实验管理系统的相关信息成为必然。开发…...

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器&#xff08;Program Counter Register&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;它在 JVM 的内存模型中扮演着非常…...

重构Action-cli前端脚手架

一、概述 最近一年&#xff0c;为了满足公司业务开发&#xff0c;解决重复搭建项目繁琐过程&#xff0c;自己开发了一个前端脚手架&#xff0c;并发布到npm。随着时间的推移&#xff0c;发现之前的版本存在很多问题&#xff0c;有些功能做不到位&#xff0c;而且代码也不是很规…...

华为USG5500防火墙配置NAT

实验要求&#xff1a; 1.按照拓扑图部署网络环境&#xff0c;使用USG5500防火墙&#xff0c;将防火墙接口加入相应的区域&#xff0c;添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip&#xff0c;使trust区域…...

【大数据学习 | HBASE高级】hive操作hbase

一般在查询hbase的数据的时候我们可以直接使用hbase的命令行或者是api进行查询就行了&#xff0c;但是在日常的计算过程中我们一般都不是为了查询&#xff0c;都是在查询的基础上进行二次计算&#xff0c;所以使用hbase的命令是没有办法进行数据计算的&#xff0c;并且对于hbas…...

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…...

《FreeRTOS列表和列表项篇》

FreeRTOS列表和列表项 1. 什么是列表和列表项&#xff1f;1.1 列表list1.2 列表项list item 2. 列表和列表项的初始化2.1 列表的初始化2.2 列表项的初始化 3. 列表项的插入4. 列表项末尾插入5. 列表项的删除6. 列表的遍历 列表和列表项是FreeRTOS的一个数据结构&#xff0c;是F…...

C++:哈希拓展-位图

目录 一.问题导入 二.什么是位图? 2.1如何确定目标数在哪个比特位? 2.2如何存放高低位 2.3位图模拟代码实现 2.3.1如何标记一个数 2.3.2如何重置标记 2.3.3如何检查一个数是否被标记 整体代码实现 标准库的Bitset 库中的bitset的缺陷 简单应用 一.问题导入 这道…...

【数据结构与算法】查找

文章目录 一.查找二.线性结构的查找2.1顺序查找2.2折半查找2.3分块查找 三.树型结构的查找3.1二叉排序树1.定义2.二叉排序树的常见操作3.性能分析 3.2平衡二叉树1.定义2.平衡二叉树的常见操作3.性能分析 3.3B树1.定义2.B树的相关操作 3.4B树1.定义2.B树与B树的比较 四.散列表1.…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...