设计模式之代理模式(Proxy)的C++实现

news2024/7/4 4:41:50

1、代理模式的提出

在组件的开发过程中,有些对象由于某种原因(比如对象创建的开销很大,或者对象的一些操作需要做安全控制,或者需要进程外的访问等),会使Client使用者在操作这类对象时可能会存在问题:(1)使用者直接访问这种对象会使系统带来很多麻烦。(2)或者使用者使不能直接访问这类对象;使用代理模式就可以解决此类问题。代理模式是在实际操作类和Client使用者之间增加一个代理类,实际操作类的一些操作,比如对象创建、接口访问、安全控制等相关操作都可以在增加的代理类里面添加相关的功能代码。这样Client实际上是通过代理类来访问和操作实际类。

2、需求描述

有一个主题类,该类具有请求功能和数据转换功能。而Client使用者不能直接访问和操作它,只能间接的通过其它类进行访问操作。

3、代理模式的代码实现

(1)代码UML图如下:

 

(2)代码实现如下:

#include <iostream>

class AbsSubject
{
public:
    virtual void request()=0;
    virtual void dataTransfer()=0;

    virtual ~AbsSubject(){};
};

class RealSubject:public AbsSubject
{
public:
    virtual void request() override
    {
        std::cout << "RealSubject request" << std::endl;
    };

    virtual void dataTransfer() override
    {
        std::cout << "RealSubject dataTransfer" << std::endl;
    }
};

class Proxy:public AbsSubject
{
private:
    RealSubject* realSubject{nullptr};
public:
    Proxy()
    {
        realSubject = new RealSubject();
    };
    virtual void request() override
    {
        if(nullptr == realSubject)
        {
            return;
        }
        std::cout << "Proxy request" << std::endl;
        realSubject->request();
    };

    virtual void dataTransfer()override
    {
        if(nullptr == realSubject)
        {
            return;
        }
        std::cout << "Proxy dataTransfer" << std::endl;
        realSubject->dataTransfer();
    };

    virtual ~Proxy()
    {
        std::cout << " ~Proxy" << std::endl;
        if(nullptr != realSubject)
        {
            delete realSubject;
            realSubject = nullptr;
        }
    }
};

class Client
{
public:
    void DoWork()
    {
        //创建代理对象
        Proxy proxy;
        //通过代理对象来访问实际对象的接口
        proxy.request();
        proxy.dataTransfer();
    }
};

int main()
{
    Client obj;
    obj.DoWork();
    return 0;
}

运行结果如下:

4、代理模式缺点

系统中类数量增加;由于增加代理类,访问实际类的速度会在某种程度上降低。增加系统复杂度。

5、代理模式优点

可以访问不能访问的对象;降低系统直接的耦合度,便于功能扩展。

关于代理模式的介绍也可参考:

设计模式之代理模式(C++实现)_墨1024的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/894033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s ingress

一、浅谈ingress &#xff08;ingress 是与service配合使用的&#xff09; Ingress能把Service&#xff08;Kubernetes的服务&#xff09;配置成外网能够访问的URL&#xff0c;流量负载均衡&#xff0c;及SSL&#xff0c;并提供域名访问的虚拟主机等&#xff0c;客户通过访问UR…

【C++学习手札】一文带你认识C++虚函数(内层剖析)

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C初识继承 ♈️今日夜电波&#xff1a;No title —REOL 1:02 ━━━━━━️&#x1f49f;──────── 4:03 …

无涯教程-Perl - use函数

描述 此函数将MODULE导出的所有功能(或仅LIST引用的功能)导入当前包的名称空间。有效等效于- BEGIN { require "Module.pm"; Module->import(); }也用于在当前脚本上强加编译器指令(编译指示),尽管从本质上讲它们只是模块。 请注意,use语句在编译时进行判断。在…

【网络】网络层——IP协议

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 网络层中&#xff0c;IP协议首部和有效载荷组成的完整数据称为数据报。 IP协议 &#x1f349;TCP和IP的…

文件批量管理,如何将文件进行一一复制备份并删除原文件里的文件

您是否经常需要对大量的文件进行复制备份和删除操作&#xff1f;是时候拥有一款高效的文件批量管理工具了&#xff01;我们的一键批量管理软件为您提供了简单而强大的解决方案&#xff0c;让您轻松地进行文件复制备份并删除原文件&#xff0c;让存储空间得到高效整理&#xff0…

为什么浙大MBA项目提前批面试要控制优秀人数比例?

大家好&#xff01;时间来到八月份&#xff0c;不知道今年浙大MBA项目的提前批面试你是否已经申请参加过&#xff1f;从剩余批次来看&#xff0c;留给考生做选择的时间确实不是很多了&#xff0c;仅剩的几个批次中&#xff0c;只有杭州第五批目前时间上还算充裕&#xff0c;其余…

Talk | ACL‘23 杰出论文奖上海交通大学吴蔚琪:预训练语言模型对本体知识的记忆与理解

本期为TechBeat人工智能社区第523期线上Talk&#xff01; 北京时间8月17日(周四)20:00&#xff0c;上海交通大学硕士研究生—吴蔚琪的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “预训练语言模型对本体知识的记忆与理解”&#xff0c;分享了预训…

八股文之八大排序(C++)

目录 1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序&#xff08;桶排序&#xff09; 9.主函数 10.画图总结 1.直接插入排序 int ai[] 为需要排序的数组 start 为起始位置&#xff0c;要求 start>1 ,因为 ai[0…

python基础4——类、异常处理、常用模块

文章目录 一、类二、python异常处理三、自定义模块3.1 保留模块测试代码3.2 添加模块使用说明 四、内置模块4.1 os标准库4.2 os.path类4.3 sys库4.4 platform库4.5 glob库4.6 random库4.7 subprocess库4.8 pickle库4.9 JSON库4.10 time库4.11 datetime库4.12 urllib库4.12.1 re…

Unity Android 之 使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理

Unity Android 之 使用 HanLP 进行句子段落的分词处理&#xff08;包括词的属性处理&#xff09;的简单整理 目录 Unity Android 之 使用 HanLP 进行句子段落的分词处理&#xff08;包括词的属性处理&#xff09;的简单整理 一、简单介绍 二、实现原理 三、注意事项 四、效…

水泥厂人员定位方案

水泥厂人员定位方案可以采用不同的技术和策略。以下是一个常见的水泥厂人员定位方案的步骤&#xff1a; 1.选择合适的定位技术&#xff1a;根据水泥厂的需求和运营环境&#xff0c;选择适合的定位技术&#xff0c;例如基于UWB&#xff08;Ultra-Wideband&#xff09;、RFID&am…

无涯教程-Perl - undef函数

描述 此函数未定义EXPR的值。用于标量,列表,哈希,函数或类型范围。在带有诸如undef $hash {$key}之类的语句的哈希上使用&#xff1b;实际上将指定键的值设置为未定义的值。 如果要从哈希中删除元素,请使用delete函数。 语法 以下是此函数的简单语法- undef EXPRundef返回…

windows ipv4 多ip地址设置,默认网关跃点和自动跃点是什么意思?(跃点数)

文章目录 Windows中的IPv4多IP地址设置以及默认网关跃点和自动跃点的含义引言IPv4和IPv6&#xff1a;简介多IP地址设置&#xff1a;Windows环境中的实现默认网关跃点&#xff1a;概念和作用自动跃点&#xff1a;何时使用&#xff1f;关于“跃点数”如何确定应该设置多少跃点数&…

【3Ds Max】布料命令的简单使用

简介 在3ds Max中&#xff0c;"布料"&#xff08;Cloth&#xff09;是一种模拟技术&#xff0c;用于模拟物体的布料、织物或软体的行为&#xff0c;例如衣物、帆布等。通过应用布料模拟&#xff0c;您可以模拟出物体在重力、碰撞和其他外力作用下的变形和动态效果。…

【学习FreeRTOS】第11章——FreeRTOS中任务相关的其他API函数

1.函数总览 序号函数描述1uxTaskPriorityGet()获取任务优先级2vTaskPrioritySet()设置任务优先级3uxTaskGetNumberOfTasks()获取系统中任务的数量4uxTaskGetSystemState()获取所有任务的状态信息5vTaskGetInfo()获取单个任务的状态信息6xTaskGetCurrentTaskHandle()获取当前任…

利用Velero对K8S备份还原与集群迁移实战

一、简介 Velero 是一款云原生时代的灾难恢复和迁移工具&#xff0c;采用 Go 语言编写&#xff0c;并在 github 上进行了开源&#xff0c;利用 velero 用户可以安全的备份、恢复和迁移 Kubernetes 集群资源和持久卷。 开源地址&#xff1a;https://github.com/vmware-tanzu/v…

Element通过v-for循环渲染的form表单校验

需求&#xff1a;有个表单信息是v-for渲染的&#xff0c;例如下图&#xff0c;通过循环遍历实现新增和删除模块&#xff0c;按照平时的写法实现校验&#xff0c;是不能实现我们想要的效果&#xff0c;根据这个需求&#xff0c;我找到了一个解决方法 1.HTML <el-form ref&qu…

【抓包工具】whistle抓包工具分享

一、使用场景 抓包请求转发 二、基础篇 官网&#xff1a;http://wproxy.org/whistle/ github: https://github.com/avwo/whistle 简介&#xff1a; whistle(读音[ˈwɪsəl]&#xff0c;拼音[wēisǒu])基于Node实现的跨平台web调试代理工具&#xff0c;类似的工具有Window…

React 之 Router - 路由详解

一、Router的基本使用 1. 安装react-router react-router会包含一些react-native的内容&#xff0c;web开发并不需要 npm install react-router-dom 2. 设置使用模式 BrowserRouter或HashRouter Router中包含了对路径改变的监听&#xff0c;并且会将相应的路径传递给子组件Bro…

优化视频流:利用美颜SDK提升直播质量的方法

随着互联网的迅猛发展&#xff0c;视频直播已成为人们分享、交流和娱乐的重要方式。然而&#xff0c;在实际的直播过程中&#xff0c;视频画质可能受到诸多因素的影响&#xff0c;例如摄像头品质、网络状况等。为了提升观众的体验和吸引更多的观众&#xff0c;美颜技术逐渐成为…