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

C++设计模式(代理模式)

1. 电话虫

        在海贼中,有一种神奇的通信工具叫做电话虫(Den Den Mushi),外形如蜗牛,身上带有斑点或条纹或通体纯色,壳顶上有对讲机或按键,不接通时会睡觉,接通时会惊醒,并发出“波噜波噜”的声音,在通话时电话虫的嘴巴会如同讲话人的嘴巴一样动,也有人的感情听得懂人类说话,工作原理是将人的声音转化为电话虫的声音进行长距离传接,经作者尾田荣一郎在SBS上证实这是自然生长的一种虫。

        
        如果拥有了属于对方的电话虫,不论彼此相隔有多远都可以进行时时通信,通过电话虫除了可以听到对方的声音,还能看到对方的表情,妥妥的一个代理人。在设计模式中有一种模式叫做代理模式,代理模式和电话虫差不多,都是为其他对象提供一种代理,以控制对这个对象的访问。

生活中关于代理的例子也有很多,比如:

  • 通过信用卡、微信、支付宝等代替现金支付
  • 开发一套对接数据库服务器的接口并提供给客户使用,用于提高服务器的访问效率
  • 跑腿小哥代替大聪明给异地的女盆友送花。
  • 通过VPN架梯子访问外网。

2. 解构电话虫

如果我们想要用代理模式来描述一下电话虫的行为,里边有如下几个细节:

  1. 说话的人是一个对象,电话虫也是一个对象,电话虫模拟的是说话的人
  2. 说话的人和电话虫有相同的行为,所以需要为二者提供一个抽象类
  3. 电话虫是在为说话的人办事,所以电话虫和说话人应该有关联关系。

根据上面的描述,先把对应的UML类图画一下:

由于电话虫类和讲话者类不是部分与整体的关系,所以这二者的关系是关联关系。

3. 通话

根据上面的UML类图,先把通话的抽象类定义出来:

// 抽象通信类
class Communication
{
public:virtual void communicate() = 0; // 通话virtual ~Communication() {}
};

 然后在根据这个抽象类,派生出两个子类:讲话者类和电话虫类:

// 讲话的人
class Speaker : public Communication
{
public:void communicate() override{cout << "开始说话..." << endl;cout << "通话时发生了一些列的表情变化..." << endl;}
};// 电话虫
class DenDenMushi : public Communication
{
public:DenDenMushi(){m_isStart = true;m_speaker = new Speaker;}~DenDenMushi(){if (m_speaker != nullptr){delete m_speaker;}}// 判断是否已经开始通话了bool isStart(){return m_isStart;}void communicate() override{if (isStart()){// 得到通话者语言和表情信息, 并加以模仿cout << "电话虫开始实时模仿通话者的语言和表情..." << endl;m_speaker->communicate();}}
private:bool m_isStart = false;Speaker* m_speaker = nullptr;
};

海贼官方给出的电话虫的名字叫做DenDenMushi,所以电话虫类也以此命名。

在代理类也就是电话虫类中,一般都会判断是否允许代理(对应示例程序中的isStart(),表示通话对否开始了),如果允许则通过被代理的对象m_speaker,调用它的操作函数communicate() 。

最后是测试代码:

int main()
{// 直接交流Communication* comm = new Speaker;comm->communicate();delete comm;cout << "===================================" << endl;// 使用电话虫comm = new DenDenMushi;comm->communicate();delete comm;return 0;
}

        上面的测试程序中一共使用了两种方式进行通信,第二种使用的是代理模式,我们可以在代理类中有效的管理被代理的对象的工作的时机,但是并没有改变被代理的对象的行为。


原文链接: https://subingwen.cn/design-patterns/proxy/#3-%E9%80%9A%E8%AF%9D

相关文章:

C++设计模式(代理模式)

1. 电话虫 在海贼中&#xff0c;有一种神奇的通信工具叫做电话虫&#xff08;Den Den Mushi&#xff09;&#xff0c;外形如蜗牛&#xff0c;身上带有斑点或条纹或通体纯色&#xff0c;壳顶上有对讲机或按键&#xff0c;不接通时会睡觉&#xff0c;接通时会惊醒&#xff0c;并发…...

Linux系统驱动(十三)Linux内核定时器

文章目录 一、内核定时器原理二、定时器API三、使用定时器让LED灯闪烁四、使用定时器对按键进行消抖 一、内核定时器原理 内核当前时间通过jiffies获取&#xff0c;它是内核时钟节拍数&#xff0c;在linux内核启动的时候&#xff0c;jiffies开始&#xff08;按照一定频率&…...

Visual Studio 调试时加载符号慢

什么是调试符号 编译程序时生成的一组特殊字符&#xff0c;并包含有关变量和函数在生成的二进制文件中的位置以及其他服务信息的信息。 该数据集可用于逐步调试程序或检查第三方代码。 调试符号可以添加到可执行文件或库中&#xff0c;但是大多数现代编译器将它们存储为单独的…...

Spring Cloud Config:动态配置的魔法师

Spring Cloud Config&#xff1a;动态配置的魔法师 在微服务架构的浩瀚星海中&#xff0c;配置管理如同一颗璀璨的星辰&#xff0c;而Spring Cloud Config则是那颗能够实现配置信息集中管理和动态刷新的魔法星。本文将深入探索Spring Cloud Config的奥秘&#xff0c;揭示如何通…...

Webpack入门基础知识及案例

webpack相信大家都已经不陌生了&#xff0c;应用程序的静态模块打包工具。前面我们总结了vue&#xff0c;react入门基础知识&#xff0c;也分别做了vue3的实战小案例&#xff0c;react的实战案例&#xff0c;那么我们如何使用webpack对项目进行模块化打包呢&#xff1f; 话不多…...

对中国人工智能与国外人工智能的思考

作为一名语文老师&#xff0c;我在教育的领域中见证着时代的变迁&#xff0c;也关注着科技的发展&#xff0c;尤其是人工智能这一前沿领域。当我们将目光投向中国人工智能与国外人工智能的发展时&#xff0c;心中不禁涌起诸多思考。 中国的人工智能近年来犹如一颗璀璨的新星&am…...

【debian系统arm架构安装docker】且换源后依旧不行就离线导入镜像

安装docker 在Debian系统上安装Docker并使用阿里云的镜像源可以通过以下步骤完成 1.更新软件包索引 前置如果需要更换源的请移步 : 初始化配置(自动连wifi,自动开启SSH)换清华源,远程桌面连接 sudo apt-get update2.安装必要的软件包以允许apt通过HTTPS使用仓库 sudo apt-get …...

Readwise 官方 Obsidian 插件使用

Readwise 官方 Obsidian 插件简介 Obsidian 中的 Readwise 注释示例 阅读已经发布了官方插件来导入你的 Readwise 数据Obsidian 。如果你还没有使用过 Readwise&#xff0c;那么值得一看。Readwise 是我最喜欢的 应用之一。我每天都在用它。因此&#xff0c;将这些数据自动导…...

A. A+B Again?

time limit per test 1 second memory limit per test 256 megabytes Given a two-digit positive integer nn, find the sum of its digits. Input The first line contains an integer tt (1≤t≤901≤t≤90) — the number of test cases. The only line of each tes…...

pr样机模板视频素材|城市户外高速路广告牌视频样机

https://prmuban.com/40369.html pr样机素材&#xff0c;全高清实景城市户外高速路广告牌视频样机模板&#xff0c;适合宣传视频制作。 主要特点&#xff1a; Adobe Premiere Pro 2024 全高清分辨率&#xff08;19201080&#xff09; 易于使用 快速渲染 无需插件 预览中使用的…...

谷歌大中华区总裁:所有企业都在问这个问题

中国开发者对于出海的热情&#xff0c;令Google大中华区总裁陈俊廷感慨。2024 Google I/O Connect&#xff08;2024Google开发者大会&#xff09;期间&#xff0c;他在接受第一财经记者独家采访时提到一个细节&#xff1a;早上7:30&#xff0c;他来到会场时&#xff0c;人们已经…...

GPT-4o:AI视觉识别的革命性飞跃

在AI的宏伟叙事中&#xff0c;图像识别技术始终扮演着关键角色。随着技术的不断演进&#xff0c;AI的视界已超越了简单的图像内容识别&#xff0c;它现在能够将视觉信息转化为引人入胜的文字描述。OpenAI最新力作——GPT-4o模型&#xff0c;以其卓越的多模态理解能力&#xff0…...

将电脑打造成私人网盘,支持外网访问之详细操作教程

你想过把自己电脑打造成随时随地访问的网盘吗&#xff1f;就是那种拥有一个属于自己的影音库&#xff0c;不用担心被和谐&#xff0c;随时可以登录访问电脑上的各种文件&#xff0c;相比传统网盘省心又安全。 使用Everything和节点小宝将电脑搭建成私人网盘&#xff0c;可以实现…...

spring同一个接口如何分页实现主表或主+联表group by查询

1 需求背景 我们的上游系统想要知道主表的记录关联子表所有记录中是否有一条满足特定的条件&#xff0c;如果有满足的就返回主表中的id。比如品牌brand主表中id为10的记录&#xff0c;在子表brand_rel中有id为1&#xff0c;2&#xff0c;3&#xff0c;4的这四个记录&#xff0…...

SpringDataJpa源码分析

我们在定义Repository的时候通常定义的时一个接口&#xff0c;而并没有去实现这个接口&#xff0c;那么Jpa是如何让开发者无需自己实现接口就可以使用Repository去操作数据库&#xff1f; 动态代理&#xff01;&#xff01;&#xff01; Repository原理 试想一下JPA是如何做的…...

卷积神经网络 - 卷积神经网络与深度学习的历史篇

序言 卷积神经网络&#xff08; Convolutional Neural Networks, CNN \text{Convolutional Neural Networks, CNN} Convolutional Neural Networks, CNN&#xff09;与深度学习作为人工智能领域的两大重要分支&#xff0c;其发展历程充满了探索与突破。深度学习&#xff0c;作…...

初识 Floodfall 算法

文章目录 **一、Floodfall 算法的概述****二、深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;在 Floodfall 算法中的应用****三、算法的基本原理****四、应用场景** 一、Floodfall 算法的概述 Floodfall 算法通常用于解决与区域填充、图的…...

[Linux] LVM挂载的硬盘重启就掉的问题解决

问题&#xff1a;系统重启后挂在逻辑卷的盘会掉&#xff08;必现&#xff09; 环境&#xff1a;SUSE Linux 11 SP4 原因&#xff1a;boot.lvm是关闭的 解决&#xff1a;boot.lvm设置开启 参考资料&#xff1a; linux下lvm状态Not avaliable问题排查及处理(常见Suse操作系统…...

YOLOv8改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有80+篇内容,内含各种Head检测头、损失函数Loss、…...

数据库规范化设计 5大基本原则

规范化设计原则是数据库设计的基本原则&#xff0c;有助于减少数据冗余&#xff0c;提高数据一致性和完整性&#xff0c;简化数据管理&#xff0c;增强数据安全性&#xff0c;对整个开发项目至关重要。而缺乏规范化设计会导致数据冗余&#xff0c;增加存储成本&#xff0c;引发…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

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

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

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...