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

news/2024/9/17 19:02:23/ 标签: 设计模式, 代理模式, c++, 算法, 数据结构, linux

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


http://www.ppmy.cn/news/1507366.html

相关文章

LVS 调度器 nat和DR模式

lvs-nat 修改请求报文的目标IP,多目标IP的DNAT 配置网络 LVS主机 注意网卡的顺序 &#xff08;nat和主机模式&#xff09; [rootlvs ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection [connection] idens160 typeethernet interface-nameens160 ​ [ip…

Java封装原生ES

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.spring-data-es操作ES1.引入依赖2.application.yml配置uris3…

【Story】编译器的基础概念与类型分类

目录 编译器详解1. 编译器的工作流程1.1 词法分析&#xff08;Lexical Analysis&#xff09;词法分析的例子 1.2 语法分析&#xff08;Syntax Analysis&#xff09;语法分析的例子 1.3 语义分析&#xff08;Semantic Analysis&#xff09;语义分析的例子 1.4 中间代码生成&…

漏洞复现-Atlassian Confluence Data Center 与 Server 存在权限绕过漏洞 (CVE-2023-22518)

1.漏洞描述 Atlassian Confluence Server是澳大利亚Atlassian公司的一套具有企业知识管理功能&#xff0c;并支持用于构建企业WiKi的协同软件的服务器版本。 Atlassian Confluence Data Center 和 Confluence Server存在安全漏洞&#xff0c;该漏洞源于授权管理不当。 2.影响…

vscode 快速生成vue 格式

1.用快捷Ctrl Shift P唤出控制台 输入“Snippets”并选择 Snippets: Configure User Snippets 2.输入vue&#xff0c;选中vue.json vs code自动生成vue.json文件 3.在 vue.json 中添加模板 {"Print to console": {"prefix": "vue2","b…

大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

SQL Zoo 5.SUM and COUNT

以下题目均来自sql zoo 1.Show the total population of the world.&#xff08;显示世界总人口&#xff09; select sum(population) from world 2.List all the continents - just once each.(列出所有的大洲——每个只列出一个) select distinct(continent) from world…

前端面试题——RN篇

文章目录 前言1.RN和React有什么区别2.RN核心组件3.scrollView和FlatList区别scrollViewList item 4.RN应用导航5.虚拟dom作用是什么目的是什么工作原理 6.RN相对于原生的ios和Android有哪些优/劣势优势劣势 7.RN生命周期8.li列表中有3条数据&#xff0c;删除第二条会发生什么9…

ES6模块化简明笔记

1、什么是模块化 详见看上一篇笔记CommonJs模块化简明笔记 2、为什么需要模块化 详见看上一篇笔记CommonJs模块化简明笔记 3、导入和导出的概念 详见看上一篇笔记CommonJs模块化简明笔记 4、模块导出&#xff08;暴露&#xff09; 4.1 导出&#xff08;暴露&#xff09;方式1&…

基于粒子群优化GRU神经网络的多输入回归分析,基于粒子群优化GRU网络多输入回归分析,基于粒子群优化GRU神经网络

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 gru的原理 粒子群算法原理 粒子群优化GRU神经网络的多输入回归分析 结果分析 展望 参考论文 背影 传统的方法回归分析容易陷入局部最优准确率低,为提高精度,本文用粒子群优化GRU神经网络的多输入回归分析 摘要 LSTM原理,…

攻防世界-web-ctf-upload

题目场景 查看源码 毫无有效的数据 官方WriteUp 本题需要利用文件上传漏洞点&#xff0c;通过绕过服务器的安全防护&#xff0c;达到getshell的目的 本题的主要考点为利用fastcgi的.user.ini特性进行任意命令执行 这里需要绕过的点如下 检查文件内容是否有php字符串 检查…

Less 教程:从入门到精通

Less 教程&#xff1a;从入门到精通 1. 引言 Less 是一种流行的动态样式表语言&#xff0c;它扩展了 CSS 的功能&#xff0c;使其更加强大和灵活。通过本教程&#xff0c;我们将深入探讨 Less 的基本概念、特性以及如何在项目中实际应用它。 2. Less 的基本概念 2.1 变量 …

vue3父组件向子组件传参的具体写法

在Vue 3中&#xff0c;父组件向子组件传参&#xff08;也称作传递props&#xff09;是一种非常基本的通信方式。下面我将详细解释如何在Vue 3中实现这一功能。 1. 定义子组件并接收props 首先&#xff0c;你需要在子组件中定义你想要接收的props。这通过在组件的props选项中完…

通过java.netHttpURLConnection类实现java发送http请求

import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public static String postForBody(String param) { try { URL url new URL(“https://usapp-open.ulifecam.com”)…

axios中的baseURL与跨域问题

axios中的baseURL 01. baseURL与跨域02. axios的baseurl为相对地址03. axios的baseURL是使用绝对路径还是相对路径04. API 请求跨域05. 生产环境代理问题我理解的baseURL 01. baseURL与跨域 三种模式配置&#xff1a; 开发环境 .env.development测试环境 .env.production生产…

游戏在抖音只有一个答案,都选C

经过2023年至2024年间多个案例的曝光&#xff0c;游戏开发商与硬核联盟之间的分歧已不再是秘密。而与此同时&#xff0c;抖音游戏发行的影响力也日益凸显&#xff0c;开始被市场所看重。 抖音能否成为取代硬核联盟的下一个渠道窗口&#xff1f; 从产品角度分析&#xff0c;抖…

Python教程:Python线程池与进程池入门

目录 1. 线程与进程的基本概念 1.1 线程 1.2 进程 1.3线程池与进程池的选择 2. Python 中的线程池与进程池 2.1 线程池 2.2 进程池 3. 实战示例 3.1 使用线程池 3.2 使用进程池 4.max_workers 详解 4.1什么是 max_workers 4.2如何设置 max_workers 4.2.1 根据任务…

自动化专业英语

前言 电子信息、电气工程、自动化专业英语词汇汇总&#xff0c;不定期更新 常用 Asynchronous&#xff1a;异步synchronous&#xff1a;同步notification&#xff1a;通知blade&#xff1a;平面shaft&#xff1a;轴magnetic&#xff1a;磁场的bearing&#xff1a;轴承valve&…

2024前端面试(内容持续更新)

Vue篇 data为什么是个函数&#xff1f; 在‌Vue中&#xff0c;‌data必须是一个‌函数&#xff0c;这是因为当data是函数时&#xff0c;每个组件实例化时都会调用该函数&#xff0c;返回一个新的数据对象&#xff0c;从而保证每个组件实例拥有独立的数据&#xff0c;避免数据冲…

Java 集成测试详解及示例

通过综合指南探索 Java 集成测试的世界。了解工具、流程和最佳实践&#xff0c;并辅以实际示例。 随着软件系统变得越来越大、越来越复杂&#xff0c;组件和服务以错综复杂的方式交互&#xff0c;集成测试已变得不可或缺。通过验证所有组件和模块在组合时是否正常工作&#xff…