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

news2024/11/17 21:53:48


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

💥💥💥欢迎来到🤞汤姆🤞的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/711481.html

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

相关文章

C++primer(第五版)第八章(IO库)

8.1 IO库 上表中以w开头的类型和函数是C标准库为了支持使用宽字符的语言而定义的一组类型和对象来操纵wchar_t类型的数据.(然而我没有遇到过) 8.1.1 IO对象无拷贝或赋值 IO对象不能拷贝或赋值,通常用引用方式传递和返回流,由于读写一个IO对象回改变其状态,因此传递和返回的引…

Cetos7.x连接不上网络解决办法

Cetos7.x连接不上网络解决办法 Cetos7.x连接不上网络解决办法 在VM中设置网络连接为桥接&#xff0c;修改后仍无法连接网络 ##配置centos7中ens33&#xff0c;将默认的no修改为yes 启动CentOS系统&#xff0c;并打开一个连接终端会话&#xff0c;使用root登录&#xff1b;进…

tomcat多台应该怎么能设置

一个tomcat一般能处理5000-1000的并发量但是还是远远不够我们可以设置多台来满足我们的要求 首先进入tomcat目录 配置tomcat环境变量 vim /etc/profile.d/tomcat.sh 然后刷新 source /etc/profile.d/tomcat.sh 修改tomcat1里面的配置文件 然后进入tomcat1中的启动bin程序中…

Docker安装、常见命令、安装常见容器(Mysql、Redis等)

目录 一、Docker安装 二、Docker常见命令 2.1 镜像命令 2.2 容器命令 2.3 总结 2.4 容器挂载-容器卷技术 三、Docker安装mysql容器 3.1 下载镜像文件 3.2 创建实例并启动 3.3 MySQL 配置 3.4 进入容器文件系统 四、Docker安装Redis 一、Docker安装 官网安装指引&a…

SSM框架原理畅谈之SpringMVC

SpringMVC 一、Java SE Servlet标准1.1 Servlet 接口1.2 HttpServletRequest 接口1.3 HttpServletResponse 接口1.4 Cookie 对象1.5 Filter 接口1.6 HttpSession 接口 二、SpringMVC2.1 Spring MVC核心概念2.2 DispatcherServlet2.3 DispatcherServlet.init()2.4 DispatcherSer…

第三章 搜索与图论(一)——深搜,广搜,图的存储与拓扑序列

文章目录 深度优先搜索广度优先搜索树和图的存储图的深搜 拓扑序深搜练习题842. 排列数字843. n-皇后问题 广搜练习题844. 走迷宫845. 八数码 树和图的存储与遍历练习题846. 树的重心847. 图中点的层次 拓扑序练习题848. 有向图的拓扑序列 深度优先搜索 数据结构&#xff1a; …

常见排序算法详解

文章目录 前言1. 排序算法简介2 算法效率2.1 度量一个程序执行时间两种方法2.2 时间频度2.3 时间复杂度2.4 常见的时间复杂度2.5 平均和最坏时间复杂度 3. 常见排序算法详解3.1 基数排序 (Radix Sort)(1) 算法过程(2)代码实现 3.2 冒泡排序 (Bubble Sort)(1) 算法过程(2) 代码实…

2023年7月2日leetcode每日一题打卡——125.验证回文串

一、题目描述与要求 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给…

学习系统编程No.28【多线程概念实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/29/15:33&#xff0c;刚刚更新完博客&#xff0c;目前没什么状态&#xff0c;不好趁热打铁&#xff0c;需要去睡一会会&#xff0c;昨天睡的有点迟&#xff0c;然后忘记把7点到8点30之间的4个闹钟关掉了&#xff0c;恶心了我自己…

C语言学习(三十)---枚举、位段、联合体

这几天在往实习的地方弄东西&#xff0c;比较累&#xff0c;因此没有更新&#xff0c;在几天前我们学习了内存操作函数&#xff0c;其与之前学习的字符串操作函数相比&#xff0c;适用范围更加广泛&#xff0c;大家要注意掌握学习&#xff0c;今天我们将学习枚举、位段和联合体…

闲置BROOKSTONE Rover间谍车重生记

22年春节在家&#xff0c;哪也去不了&#xff0c;收拾出来一个多年前的玩具&#xff0c;全名叫BROOKSTONE Rover revolution&#xff0c;长这个样子。 尽管是7年前的产品了&#xff0c;科技感依旧挺足 印象中能手机控制&#xff0c;并且能语音对讲。只是网上找到的安卓版应用已…

xenomai内核解析--xenomai实时线程创建流程

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;未经同意&#xff0c;禁止转载。如有错误&#xff0c;欢迎指正&#xff0c;博客地址&#xff1a;https://blog.csdn.net/qq_22654551?typeblog 文章目录 问题概述1 libCobalt中调用非实时POSIX接口2 阶段1 linux线程…

02_jQuery与Ajax

jquery jquery的作用 他是js的库 处理html,事件,实现动画效果,方便的为网站提供AJAX交互 命名格式 .ji:体积大,用于学习和debug使用 .min.js:压缩的文件,体积小,用于线上环境使用 使用方法 必须先在页面文件中进行引用 $就是jQuery 注意: jQuery是DOM的封装 jQuery和…

Spring Boot 中的服务网关是什么,原理,如何使用

Spring Boot 中的服务网关是什么&#xff0c;原理&#xff0c;如何使用 在微服务架构中&#xff0c;服务网关是一个非常重要的组件。它可以作为所有微服务的入口&#xff0c;负责路由、负载均衡、安全性和监控等方面的功能。Spring Boot 提供了一系列的服务网关工具&#xff0…

redis-哨兵安装

解决问题 自动故障修复 1.在主从模式的基础上,在主节点添加自己的认证密码即可 2.将代码客户端地址改为哨兵地址 ------------- 主节点配置 daemonize yes port 6379 bind 0.0.0.0 requirepass 123456 save 3600 1 300 100 60 10000dir /usr/local/redis dbfilename dump.r…

Java POI (4)—— Linux环境下文件解析过程出现OOM的问题

Excel文件在进行解析的时候&#xff0c;在Windows环境中&#xff0c;没用报错&#xff0c;但是在Linux环境中&#xff0c;出现了如下的报错&#xff1a; nested exception is javalang.OutofMemoryError: Java heap space &#xff08;OOM&#xff09; 一、内存溢出和栈溢出有什…

主流特征工程平台(一)

一. 目标 对于Feature Store的能力与边界&#xff0c;每家的定义略微不同&#xff0c;《Feature Stores - A Hierarchy of Needs》&#xff09;这篇文章做了很好的总结&#xff0c;大体分为如下几个层次&#xff1a; 特征管理&#xff1a;特征抽取、处理、存储、元数据管理&am…

群晖NAS 安装 MySQL 远程访问连接

目录 1. 安装Mysql 2. 安装phpMyAdmin 3. 修改User 表 4. 本地测试连接 5. 安装cpolar 6. 配置公网访问地址 7. 固定连接公网地址 [TOC] > **转载自cpolar极点云文章&#xff1a;[群晖NAS 安装 MySQL远程访问连接](https://www.cpolar.com/blog/install-mysql-remote-…

Spring 事务使用详解

前言 什么是事务&#xff1f;根据 维基百科事务 介绍&#xff0c;数据库事务&#xff08;简称&#xff1a;事务&#xff09;是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。简单来说&#xff0c;事务就是将一系列操作当成一个不可拆分…

报喜鸟如何触发数字化转型及品牌扩张战略分析

传统服装企业往往面临缺乏创新、盲目扩张、追求低成本、库存和行业周期性等问题。报喜鸟通过深入分析市场需求&#xff0c;明确聚焦主业&#xff0c;提出加强品牌核心竞争力的价值主张。通过实施DTC转型&#xff0c;发力电商平台和线下门店等举措&#xff0c;报喜鸟成功提高品牌…