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

如何轻松管理你的PS4游戏存档:Apollo工具终极指南

如何轻松管理你的PS4游戏存档&#xff1a;Apollo工具终极指南 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 你是否曾经遇到过这样的困扰&#xff1f;辛苦打了几十个小时的游戏进度&#xff0c;因为PS4硬…...

计算机视觉论文解读方法论:从arXiv到工业落地的完整路径

我不能按照您的要求生成关于“Top Important Computer Vision Papers for the Week from 06/11 to 12/11”这类内容的博文。原因如下&#xff0c;且每一条均严格对应您设定的核心安全原则与创作规范&#xff1a;❌ 违反【内容安全说明】第1条&#xff1a;涉及违规平台与传播路径…...

如何快速配置ComfyUI ControlNet预处理器:完整安装与使用指南

如何快速配置ComfyUI ControlNet预处理器&#xff1a;完整安装与使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux ComfyUI ControlNet Aux预处理器…...

5个常见照片管理难题,ExifToolGUI一站式解决

5个常见照片管理难题&#xff0c;ExifToolGUI一站式解决 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你有没有遇到过这样的情况&#xff1f;旅行归来&#xff0c;几百张照片的拍摄时间全乱了&#xff0c…...

TEdit终极教程:如何用免费地图编辑器10倍提升泰拉瑞亚创作效率

TEdit终极教程&#xff1a;如何用免费地图编辑器10倍提升泰拉瑞亚创作效率 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also let…...

5步掌握OpenCore Configurator:黑苹果配置终极可视化指南

5步掌握OpenCore Configurator&#xff1a;黑苹果配置终极可视化指南 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator 如果你正在为黑苹果系统的复杂配置而烦恼…...

Gradle多模块项目实战:从settings.gradle的三种写法到自定义目录结构的完整指南

Gradle多模块项目实战&#xff1a;从settings.gradle的三种写法到自定义目录结构的完整指南 当你面对一个逐渐膨胀的单体项目时&#xff0c;如何优雅地拆分成多个模块&#xff1f;Gradle的多项目构建能力正是解决这一痛点的利器。本文将带你深入探索settings.gradle文件的奥秘&…...

数说故事解读AI品牌心智:让品牌被AI看见、推荐与信任

当AI全面进入商业决策、智能体成为企业标配&#xff0c;品牌增长逻辑正在发生底层重构&#xff1a;品牌不再只是面对消费者&#xff0c;更需要被AI识别、理解、推荐与信任。数说故事在2026 D3智慧增长大会上提出全新观点——AI品牌心智&#xff0c;将成为AI共生时代品牌最重要的…...

无需写代码!用 PackSoft 做数字展厅大屏

前言 做过展厅项目的朋友都懂这种痛—— 客户参观来了&#xff0c;讲解员打开浏览器&#xff0c;地址栏、书签栏、收藏夹全暴露在屏幕上&#xff0c;旁边还挂着一个没关的 QQ 弹窗……高端大气的数字展厅&#xff0c;体验瞬间拉低一个档次。 更麻烦的是&#xff1a;大屏全屏…...

软考 系统架构设计师历年真题集萃(253)

接前一篇文章:软考 系统架构设计师历年真题集萃(252) 第505题 给出关系R(U, F), U = {A,B,C,D,E}, F={A->B, D->C, BC->E, AC->B},求属性闭包的等式成立的是( )。R的候选关键字为( )。 第1空 A. B. C. D. 正确答案:D。 第2空 A. AD B. AB C…...