当前位置: 首页 > 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.…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...