(二)结构型模式:8、代理模式(Proxy Pattern)(C++示例)

目录

1、代理模式(Proxy Pattern)含义

2、代理模式的UML图学习

3、代理模式的应用场景 

4、代理模式的优缺点

5、C++实现代理模式的实例


1、代理模式(Proxy Pattern)含义

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

代理模式(Proxy Pattern)是一种结构型设计模式,它通过引入一个代理对象来控制对真实对象的访问。代理对象充当了客户端与真实对象之间的中介,可以在访问真实对象前后进行一些额外的操作。

2、代理模式的UML图学习

主要角色:

(1)抽象主题(Subject):定义了真实对象和代理对象共同实现的接口,客户端通过该接口访问真实对象。

(2)真实主题(Real Subject):定义了真正执行业务逻辑的对象,是代理对象所代表的真实对象。

(3)代理(Proxy):持有一个真实主题的引用,并实现了抽象主题的接口。在需要时,代理对象会创建、销毁或控制真实对象的访问。

3、代理模式的应用场景 

(1)远程代理,也就是为了一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实【DP】;

(2)虚拟代理,是根据需要开销很大的对象。通过它来存放实例化需要很长时间的真实对象【DP】;

(3)安全代理,用来控制真实对象访问时的权限【DP】;

(4)智能引用,是指当调用真实的对象时,代理处理另外一些事【DP】。

4、代理模式的优缺点

(1)优点:

1)代理模式可以实现对真实对象的访问控制。通过代理对象,可以在调用真实对象之前或之后进行一些额外的操作,例如权限验证、缓存数据等。

2)代理模式可以实现对真实对象的保护。客户端只能通过代理对象来访问真实对象,可以隐藏真实对象的具体实现细节,提高了系统的安全性。

3)代理模式可以实现远程访问。通过代理对象,可以在不同的进程或服务器上访问真实对象,实现分布式系统的通信和协作。

4)代理模式可以实现延迟加载。当真实对象的创建和初始化过程比较耗时时,可以通过代理对象来延迟加载真实对象,提高系统的响应速度。

(2)缺点:

1)增加了系统的复杂性。引入了代理对象会增加代码量和类的数量,增加了系统的复杂性和维护成本。

2)代理模式可能会降低系统的性能。由于代理对象需要额外的处理逻辑,可能会导致系统的性能下降。

总结来说,代理模式的优点包括对真实对象的访问控制、保护、远程访问和延迟加载;缺点包括增加系统复杂性和可能降低系统性能。在使用代理模式时,需要根据具体的场景和需求来权衡利弊,并选择合适的实现方式。

5、C++实现代理模式的实例


#include <iostream>

// 抽象主题
class Subject 
{
public:
    virtual void request() = 0;
};

// 真实主题
class RealSubject : public Subject 
{
public:
    void request() override 
    {
        std::cout << "真实主题处理请求" << std::endl;
    }
};

// 代理
class Proxy : public Subject 
{
private:
    RealSubject* realSubject;

public:
    void request() override 
    {
        if (realSubject == nullptr) 
        {
            realSubject = new RealSubject();
        }

        // 在调用真实主题前后可以添加额外的操作
        std::cout << "代理对象处理请求前" << std::endl;

        realSubject->request();

        std::cout << "代理对象处理请求后" << std::endl;
    }
};

int main() 
{
    // 创建代理对象
    Proxy proxy;

    // 通过代理对象访问真实对象
    proxy.request();

    return 0;
}

 在上述示例中,抽象主题(Subject)定义了一个纯虚函数 request(),真实主题(RealSubject)和代理(Proxy)都继承自抽象主题。代理对象持有一个真实主题的引用,在调用真实主题的 request() 方法前后可以添加额外的操作。

当客户端通过代理对象访问真实对象时,代理对象会先进行一些预处理操作,然后再调用真实对象的 request() 方法,最后进行一些后处理操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据-玩转数据-Flink 自定义Sink(Mysql)

一、说明 如果Flink没有提供给我们可以直接使用的连接器&#xff0c;那我们如果想将数据存储到我们自己的存储设备中&#xff0c;mysql 的安装使用请参考 mysql-玩转数据-centos7下mysql的安装 创建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…

Wi-Fi 安全在学校中的重要性

Wi-Fi 是教育机构的基础设施&#xff0c;从在线家庭作业门户到虚拟教师会议&#xff0c;应有尽有。大多数 K-12 管理员对自己的 Wi-Fi 网络的安全性充满信心&#xff0c;并认为他们现有的网络安全措施已经足够。 不幸的是&#xff0c;这种信心往往是错误的。Wi-Fi 安全虽然经常…

Layui列表表头去掉复选框改为选择

效果&#xff1a; 代码&#xff1a; // 表头复选框去掉改为选择 $(".layui-table th[data-field"0"] .layui-table-cell").html("<span>选择</span>");

keil构建STM32工程并使用proteus仿真led点灯实验

STM32单片机与51单片机有很大区别&#xff0c;不仅结构上有很大差异&#xff0c;STM32更复杂一些&#xff0c;在操作上来说&#xff0c;STM32也要复杂很多&#xff0c;51单片机上手写代码&#xff0c;可以很直接操作引脚&#xff0c;但是STM32单片机在操作引脚之前需要作很多初…

数据结构——栈(C语言)

需求&#xff1a;无 栈的概念&#xff1a; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端为栈底。栈中的数据元素遵守后进先出&#xff08;LIFO&#xff09;原则。压栈&…

分类预测 | MATLAB实现MTBO-CNN多输入分类预测

分类预测 | MATLAB实现MTBO-CNN多输入分类预测 目录 分类预测 | MATLAB实现MTBO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现MTBO-CNN多输入分类预测 2.代码说明&#xff1a;基于登山队优化算法&#xff08;MTBO&#xff09;、卷积神经…

ABAP: SQL 多值查询

基础查数据 问题举例&#xff1a;例如查物料类型为ZFRT、ZROH和ZRSA的物料编码。 1、直接查询&#xff0c;三种不同类型的物料类型是或的关系。 SELECT DISTINCT ma~matnr ma~mtartFROM mara AS maINNER JOIN mbewh AS mbON ma~matnr mb~matnrINTO CORRESPONDING FIELDS OF…

EmbedPress Pro 在WordPress网站中嵌入任何内容

EmbedPress Pro可让您通过高级自定义、自定义品牌、延迟加载和更多惊人功能嵌入源。为古腾堡块和Elementor编辑器提供支持的一体化 WordPress 嵌入解决方案。使用 EmbedPress 在古腾堡创建交互式内容。使用 EmbedPress 的古腾堡块立即将任何内容嵌入到您的网站。 网址: EmbedP…

最强自动化测试框架Playwright(29)-文件选择对象

FileChooser对象通过page.on("filechoose")事件监听。 如下代码实现点击百度搜图按钮&#xff0c;上传文件进行搜索。 from playwright.sync_api import Playwright, sync_playwright, expectdef run(playwright: Playwright) -> None:browser playwright.chro…

linux 学习————LNMP之分布式部署

目录 一、概述 二、LNMP环境部署 三、配置nginx 四、 配置php使nginx能够解析.php 五、配置mysql 六、配置discuz进行登录论坛访问测试 一、概述 LNMP代表 Linux、Nginx、MySQL、PHP&#xff0c;是一种常用的服务器架构。它由以下组件组成&#xff1a; Linux&#xff1a;作…

docker的数据管理

目录 一.如何管理docker容器中的数据 二.数据卷 2.1数据卷原理 2.2数据卷作用 2.3数据卷案例 三.数据卷容器 3.1数据卷容器的作用 3.2端口映射 一.如何管理docker容器中的数据 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Contain…

查看 Linux 内核版本的几种方法

uname -a uname -srm uname -r 分拆&#xff1a;Linux 5.13.0-19-generic x86 64 5-内核版本 13-主修订版本 0-19 -次要修订版本 过查看 /proc/version 文件确认 /proc 目录包含虚拟文件&#xff0c;其中包含有关系统内存&#xff0c;CPU内核&#xff0c;已安装文件系统等的信…

详解零售行业供应链管理核心KPI指标(四)

现在零售行业的供应链管理越来越复杂了&#xff0c;复杂的原因是因为市场的变化、商业模式、销售模式的变化。 比如在以往传统的线上电商平台、线下渠道&#xff0c;现在线上电商还增加直播带货&#xff0c;线下渠道又增加了O2O模式。从一线城市的供应链还是做到供应链下沉到二…

开源数据库Mysql_DBA运维实战 (修改root密码)

MySQL——修改root密码的4种方法 本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法&#xff0c;大家可以可以根据的自己的情况自由选择&#xff0c;希望对大家有所帮助 方法1&#xff1a; 用SET PASSWORD命令 首先登录MySQL。 格式&#xff1a;mysql> set pass…

Linux命令200例:ps用于查看当前系统中运行的进程信息(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

Linux安装Nginx

Linux安装Nginx 下载Nginx上传文件至服务器编译启动 下载Nginx 官网下载地址&#xff1a;https://nginx.org/en/download.html 或者关注wx公众号&#xff1a;一颗星宇宙&#xff0c;发送&#xff1a;Linux服务部署获取下载地址 上传文件至服务器 使用rz命令进行选择文件上传…

拉丁方设计资料的方差分析(SPSS版+SAS版)

拉丁方设计&#xff08;Latin square design&#xff09;&#xff1a;实验研究中涉及一个处理因素和两个控制因素&#xff0c;每个因素的类别数或水平数相等&#xff0c;此时可采用拉丁方设计&#xff0c;将两个控制因素分别安排在拉丁方设计的行和列上。该设计类型仍为单因素方…

爬虫逆向实战(十五)--阿某某营登录

一、数据接口分析 主页地址&#xff1a;阿某某营 1、抓包 通过抓包可以发现登录接口是Users/Login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个s加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cookie是…

工程项目管理系统源码+功能清单+项目模块+spring cloud +spring boot em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

APP内嵌小游戏,全面提升用户活跃、留存

开发者想要提高APP的用户活跃度可以通过拉新的方式完成&#xff0c;但目前拉新的成本较高&#xff0c;而且新的目标用户一般很难留住&#xff0c;流失率也比较高。 此时&#xff0c;可以通过植入小游戏的方式来提高用户活跃度&#xff0c;游戏的优势在于可以快速吸引用户&…