2023-6-28-第十一式代理模式

news2024/11/18 3:32:40


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之代理模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、代理模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过代理对象控制对真实对象的访问。代理模式在访问对象时引入了一个中间层,以便在不改变原始对象的情况下增加额外的功能或限制访问。

代理模式的核心思想是通过引入代理对象,代替直接访问真实对象。代理对象与真实对象具有相同的接口,使得客户端可以透明地使用代理对象,而无需关心真实对象的具体实现。

代理模式的常见应用场景包括:

  1. 远程代理(Remote Proxy):代理对象用于控制对远程对象的访问,隐藏了网络通信的细节。

  2. 虚拟代理(Virtual Proxy):代理对象用于延迟加载真实对象,避免在需要时立即创建或加载大量资源。

  3. 安全代理(Protection Proxy):代理对象用于控制对真实对象的访问权限,实现权限验证和安全性控制。

  4. 智能代理(Smart Proxy):代理对象用于在访问真实对象前后执行额外的逻辑,如缓存数据、记录日志、性能优化等。

代理模式的优点包括:增加了代码的灵活性和可扩展性,对客户端透明,保护了真实对象的访问,提供了额外的功能。

然而,代理模式也有一些缺点,例如增加了系统的复杂性和开销,可能导致性能下降。

总之,代理模式是一种常见的设计模式,用于控制对真实对象的访问,并提供额外的功能或限制访问。它可以应用于各种场景,根据具体需求选择适当的代理模式实现。


🐱‍🐉二、代理模式实现

在C++中,可以使用类来实现代理模式。以下是一个简单的示例代码,演示如何使用代理模式来控制对真实对象的访问:

#include <iostream>

// 真实对象接口
class RealObject {
public:
    virtual void doSomething() {
        std::cout << "RealObject: Doing something." << std::endl;
    }
};

// 代理对象
class ProxyObject : public RealObject {
private:
    RealObject* realObject; // 真实对象指针

public:
    ProxyObject() {
        realObject = new RealObject();
    }

    ~ProxyObject() {
        delete realObject;
    }

    void doSomething() {
        // 在访问真实对象之前可以添加额外的逻辑
        std::cout << "ProxyObject: Before calling real object." << std::endl;

        // 调用真实对象的方法
        realObject->doSomething();

        // 在访问真实对象之后可以添加额外的逻辑
        std::cout << "ProxyObject: After calling real object." << std::endl;
    }
};

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

    // 通过代理对象调用方法
    proxy.doSomething();

    return 0;
}

在上述示例中,RealObject 是真实对象的接口,ProxyObject 是代理对象,继承自 RealObject。代理对象在调用真实对象的方法之前和之后添加了额外的逻辑。

通过创建代理对象并调用其方法,可以通过代理对象间接地访问真实对象,并在访问前后执行额外的操作。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体需求进行更复杂的实现。

希望这个示例对您有所帮助,如果您有任何进一步的问题,请随时提问。


🎉三、模块之间的关系

在代理模式中,通常涉及三个主要角色:客户端、代理对象和真实对象。这些角色之间的关系如下:

  1. 客户端(Client):客户端是使用代理对象的角色,它向代理对象发出请求,并且可以通过代理对象间接地访问真实对象。

  2. 代理对象(Proxy):代理对象是客户端和真实对象之间的中间层。它实现了与真实对象相同的接口,以便与客户端进行交互。代理对象在接收到客户端的请求时,可以在调用真实对象之前或之后添加额外的逻辑。代理对象还可以控制对真实对象的访问权限,并提供额外的功能。

  3. 真实对象(Real Object):真实对象是代理对象所代表的实际对象。它实现了代理对象定义的接口,并提供真正的功能和服务。

在代理模式中,客户端通过与代理对象进行交互,间接地访问真实对象。代理对象在必要时将请求传递给真实对象,并在适当的时候添加额外的逻辑。这种间接访问的方式可以提供更好的控制和灵活性,同时保护真实对象的访问和提供额外的功能。

总之,代理模式中的模块之间的关系是客户端通过代理对象来间接访问真实对象,代理对象充当了客户端和真实对象之间的中间层。这种关系使得代理模式可以提供更好的控制和额外的功能。


🐱‍🚀四、注意事项

在使用代理模式时,有一些注意事项需要考虑:

  1. 接口一致性:代理对象和真实对象应该实现相同的接口,以便在客户端中可以无缝切换代理对象和真实对象。

  2. 代理对象的透明性:代理对象应该对客户端透明,即客户端不需要知道是否在与真实对象直接交互还是通过代理对象进行交互。

  3. 控制访问权限:代理对象可以用于控制对真实对象的访问权限,例如进行身份验证、权限验证等。

  4. 额外功能的添加:代理对象可以在调用真实对象之前或之后添加额外的逻辑,例如缓存数据、记录日志、性能优化等。

  5. 代理对象的生命周期管理:如果代理对象内部包含有资源或状态,需要注意适当管理代理对象的生命周期,确保资源的正确释放和状态的维护。

  6. 性能考虑:代理模式可能引入额外的开销,因此需要在设计和实现时考虑性能方面的因素。

  7. 安全性考虑:代理模式在安全性方面有一定的应用,例如安全代理用于权限控制。在设计和实现代理模式时,需要考虑安全性需求,并采取适当的安全措施。

请注意,代理模式的具体应用和实现方式会因场景和需求的不同而有所变化。在使用代理模式时,根据具体情况和需求,灵活应用和调整代理模式的实现。


🎂五、使用场景

代理模式在许多不同的场景中都有应用,以下是一些常见的使用场景:

  1. 远程代理(Remote Proxy):用于在本地代理对象和远程对象之间进行通信,隐藏了网络通信的细节。常见的例子包括远程方法调用(RPC)和远程服务访问。

  2. 虚拟代理(Virtual Proxy):用于延迟加载大型资源或复杂对象,以提高性能和节省资源。在需要时,代理对象负责加载和实例化真实对象。常见的例子包括图片加载和懒加载。

  3. 安全代理(Protection Proxy):用于控制对敏感资源或受限资源的访问权限。代理对象可以验证调用者的身份和权限,以确保只有授权的用户可以访问。常见的例子包括访问控制和身份验证。

  4. 智能代理(Smart Proxy):用于在访问真实对象前后执行额外的逻辑,如缓存数据、记录日志、性能优化等。代理对象可以根据需要在访问前后添加额外的功能。常见的例子包括缓存代理和日志记录。

  5. 访问控制代理(Access Control Proxy):用于限制对对象的访问,只允许特定的客户端或特定条件下的访问。代理对象可以根据访问策略进行访问控制。常见的例子包括防火墙和反垃圾邮件过滤器。

  6. 延迟初始化代理(Lazy Initialization Proxy):用于延迟初始化对象,直到真正需要时才进行初始化。代理对象负责在需要时创建和初始化真实对象。常见的例子包括数据库连接池和资源池。

以上只是代理模式的一些常见应用场景,实际上代理模式在许多其他情况下也可能有用。在设计和实现时,根据具体需求选择适当的代理模式,并确保代理对象和真实对象之间的接口一致性。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于代理模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

解读 RocketMQ 5.0 全新的高可用设计

作者&#xff1a;斜阳 高可用架构演进背景 在分布式系统中不可避免的会遇到网络故障&#xff0c;机器宕机&#xff0c;磁盘损坏等问题&#xff0c;为了向用户不中断且正确的提供服务&#xff0c;要求系统有一定的冗余与容错能力。RocketMQ 在日志&#xff0c;统计分析&#x…

Selenium系列(二) - 详细解读针对浏览器的操作

控制浏览器有哪些操作&#xff1f; 最大化、最小化浏览器控制、获取浏览器大小获取当前标签页title、url前进、后退、刷新执行js语句打开、关闭新标签页滚动页面 点击右边目录即可跳转哦&#xff01; -------------->>>>>>>>>> 最大化、最小化…

从零开始 Spring Boot 51:JPA 中的默认列值

从零开始 Spring Boot 51&#xff1a;JPA 中的默认列值 图源&#xff1a;简书 (jianshu.com) JPA 是一个 ORM 框架&#xff0c;因此&#xff0c;通常我们需要在实体类中定义表结构&#xff0c;这其中就包含可能的字段默认值。 本文介绍如何在 Hibernate&#xff08;JPA&#…

HBase(6):计数操作

1 需求 查看HBase中的ORDER_INFO表&#xff0c;一共有多少条记录。 2 count命令 count命令专门用来统计一个表中有多少条数据。语法&#xff1a; count 表名 注意&#xff1a;这个操作是比较耗时的。在数据量大的这个命令可能会运行很久&#xff0c;真实环境不要使用该命令。…

【从零开始学习JAVA | 第二十五篇】泛型

目录 前言&#xff1a; 泛型&#xff1a; 额外拓展&#xff1a; 总结&#xff1a; 前言&#xff1a; 本文将详细介绍之前我们在JAVA 中一直在讲的泛型&#xff0c;各位感兴趣的同学可以点击进来观看。 泛型&#xff1a; 泛型是一种编程概念&#xff0c;它允许在定义类、接…

文章测试

Markdown示例 本文件的源码是一个markdown文件,也就是说在本工程中直接添加markdown即可嵌入到sphinx文档中。 关于使sphinx支持markdown的详细配置说明&#xff0c;请参考文档markdown-sphinx。 markdown的公式语法在sphinx可能不支持。 以下是markdown的语法使用示例 文…

PDF如何转换成Word?PDF转Word方法分享!​

PDF大家都不陌生了吧&#xff1f;作为打工人&#xff0c;学生党的大家都知道&#xff0c;PDF是现在不可或缺的文件传输工具之一&#xff0c;不仅可将文档转为Word&#xff0c;还可以转成excel,ppt等各种形式&#xff0c;其重要性不言而喻&#xff0c;那么今天小编就跟大家具体说…

Web自动化元素定位之xpath定位详解

Web自动化常见的定位方式 为什么要学习定位 1.让程序操作指定元素&#xff0c;就必须先找到此元素 2.程序不像人类用眼睛直接定位到元素 webDriver提供了八种定位元素的方式 定位方式总结 1.id、name、class_name、tag_name:根据元素的标签或元素的属性来进行定位 2.link_t…

gitLab配置ssh实现私钥访问

1.配置ssh文件 1.cd C:\Users\用户名\.ssh 找到文件夹 删除.ssh 里面所有其他文件方面我们配置要最新的 2.win r cmd 呼出命令行 ssh-keygen -t rsa -C "必须对应gitLab用户名" 3.生成文件夹拿到ssh 4.复制id_rsa_pub 文件的全部字符串 公钥给到GitLab服务器 2.公…

使用 JavaScript 在没有插件的情况下输入文本掩码

文章目录 JavaScript 中信用卡号的输入掩码JavaScript 中的邮政编码输入掩码在 JavaScript 中使用括号输入掩码的电话号码为 JavaScript 中的不同字段自定义输入掩码 JavaScript 输入掩码或掩码文本框是一种控件&#xff0c;它为用户提供了一种简单可靠的方式来收集基于标准掩码…

【Servlet学习三】实现一个内存版本的简易计算器~

目录 一、方式1&#xff1a;使用form表单的形式&#xff08;不推荐&#xff09; &#x1f308;1、前端代码&#xff1a;HTML文件 &#x1f308;2、后端代码&#xff1a;Calculator_form.java文件 &#x1f308;3、最终效果 二、方式2&#xff1a;使用ajax形式&#xff08;…

力扣 105. 从前序与中序遍历序列构造二叉树

题目来源&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/ C题解&#xff1a;前序遍历是中左右&#xff0c;中序遍历是左中右&#xff0c;所以拿到两个遍历数组&#xff0c;我们可以从前序遍历首节点获取中间…

Docker 私有仓库

一、私有仓库搭建 拉取私有仓库镜像 docker pull registry 启动私有仓库 docker run -id --nameprivate_registry -p 5000:5000 registry 打开浏览器输入 http://私有仓库服务器IP地址:5000/v2/_catalog 修改 daemon.json 文件 sudo gedit /etc/docker/daemon.json 在…

在Mapper.xml中写复杂的动态SQL语句

说明&#xff1a;在三层架构开发中&#xff0c;使用Mybatis框架操作数据库有两种方式&#xff0c;一种是在Mapper类里的方法上加注解&#xff08;Select、Insert等&#xff09;&#xff0c;另一种是在Mapper.xml文件的标签内写SQL语句。第二种方式相比第一种&#xff0c;具有更…

electron webview 页面加载事件顺序

electron webview 页面加载事件顺序 1.did-start-loading 页面开始加载web 2.load-commit 主页面文档加载框架 3.page-title-updated titledom 4.dom-ready 主页面 dom 加载完成electron 5.load-commit frame文档加载.net 6.did-frame-finish-load frame 加载完成cdn 7.d…

Springboot钉钉免密登录集成(钉钉小程序和H5微应用)

欢迎访问我的个人博客:www.ifueen.com RT&#xff0c;因为业务需要把我们系统集成到钉钉里面一个小程序和一个H5应用&#xff0c;并且在钉钉平台上面实现无感登录&#xff0c;用户打开我们系统后不需要再输入密码即可登录进系统&#xff0c;查阅文档实际操作过之后记录一下过程…

HTML转EXE工具(HTML App Build)永久免费版

HTML转EXE工具&#xff08;HTM2EXE&#xff09;在CSDN上发布时间轴&#xff1a; 序号时间链接12022-08-17HTML转EXE工具&#xff08;HTML App Build&#xff09;初始版22023-02-18HTML转EXE工具&#xff08;HTML App Build&#xff09;最新版32023-06-23&#xff08;实际未发布…

高德地图点聚合报错

最近做项目遇到这样一个玄学问题&#xff1a; 在写高德地图的时候加一个覆盖物 除了金华市其他城市覆盖并且不能点击&#xff0c;金华市内点击获取坐标点这样一个业务&#xff0c; 到这里都很正常&#xff0c;代码奉上 const AMap window.AMapconst state reactive({mapInp…

黑客进行网络欺骗攻击的手段有哪些?

网络欺骗主要方式有&#xff1a;IP 欺骗、ARP 欺骗、DNS 欺骗、Web 欺骗、电子邮件欺骗、源路由欺骗和地址欺骗等。其技术主要分为 HONEYPOT、分布式 HONEYPOT 和欺骗空间技术等。其中&#xff0c;源路由欺骗方式指通过指定路由&#xff0c;以假冒身份与其他主机进行合法通信或…

python实现遗传算法(单目标优化,多目标优化)

首先我们应该熟悉numpy的矩阵取值 [:, 1::2] # 第一维&#xff0c;从第二个元素起步长为2取元素[:, ::2] # 第一维&#xff0c;从第一个元素起步长为2取元素 1 遗传本质 染色体的交叉和变异 种群&#xff1a;很多个个体组成的群体&#xff0c;即为所有可能解的集合个体&…