当前位置: 首页 > article >正文

设计模式的艺术-代理模式

结构性模式的名称、定义、学习难度和使用频率如下表所示:

1.如何理解代理模式

  1. 代理模式(Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式

  2. 代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。在Java RMI、EJB、Web Service、Spring AOP等技术和框架中都使用了代理模式。

2.常见的代理模式有哪些?

  1. 远程代理:为一个位于不同地址空间的对象提供本地代表。比如,在分布式系统中,客户端通过远程代理来访问远程服务器上的对象。

  2. 虚拟代理:根据需要创建开销很大的对象。例如,在图片加载的场景中,先显示一个占位图,真正需要显示图片时再加载实际的图片对象。

  3. 保护代理:基于不同权限控制对原始对象的访问。比如,在一个数据库访问的场景中,原始对象是数据库操作的接口,而保护代理会在接收到访问请求时,检查请求者的身份和权限。如果请求者没有足够的权限执行某些数据库操作(如删除数据、修改关键配置等),保护代理会拒绝该请求,只允许执行其权限范围内的操作(如读取数据、添加非关键记录等)。

  4. 智能引用代理:在访问对象时执行额外的操作,例如引用计数、记录访问日志等。

3.如何理解代理模式中的远程代理?

  1. 主要用于解决在不同的地址空间(通常是在不同的机器或进程中)访问对象的问题。

  2. 比如,一个在线银行系统,服务器端有处理账户操作的对象。客户端通过远程代理发送请求,如查询余额、转账等,远程代理将请求序列化后通过网络发送到服务器,服务器处理后将结果返回,远程代理再将结果反序列化并提供给客户端。

  3. 远程代理隐藏了网络通信、数据序列化等复杂的底层细节,让客户端感觉就像是在本地直接操作对象一样。

4.如何理解代理模式中的虚拟代理?

  1. 用于在需要时才创建或加载 “昂贵” 的对象,以提高性能和资源利用效率。

  2. 例如我们正在浏览一个网页,页面上有很多图片。但一次性加载所有图片会消耗大量的网络带宽和时间,导致页面加载缓慢。这时就可以使用虚拟代理。

  3. 虚拟代理的核心思想是延迟对象的创建或初始化,直到真正需要的时候,从而避免不必要的资源消耗和性能下降。

5.代理模式的优缺点

  1. 优点

    1. 可以在不修改原始对象的情况下,为对象添加额外的功能,如日志记录、权限控制等,符合开闭原则。

    2. 降低耦合度:代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度,满足迪米特法则。

    3. 保护隐私:保护代理可以隐藏原始对象的一些敏感信息和操作,保护其不被不当访问。

    4. 提高性能:例如虚拟代理可以实现延迟加载,从而提高系统的性能和响应速度。

  1. 缺点

    1. 增加复杂性:引入代理对象会增加系统的复杂性,特别是在多层代理的情况下。

    2. 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,例如保护代理。

6.代理模式的适用场景

  1. 远程对象访问:当需要访问位于远程服务器上的对象时,使用远程代理来隐藏网络通信的细节。

  2. 虚拟资源加载:如前面提到的图片、大型文件或复杂数据的延迟加载,使用虚拟代理来优化性能。

  3. 权限控制:对某些敏感对象或操作进行权限验证,只有符合权限的请求才能通过保护代理访问实际对象。

  4. 日志记录与监控:在对象方法调用前后进行日志记录或性能监控,通过代理来添加这些额外功能。

  5. 智能引用:例如实现对象的引用计数,通过代理来管理对象的生命周期。

以上内容为根据书本内容配合搜索引擎整理得来,目的是为了学习,要是有侵权的情况发生,请联系我,我会立即予以删除,谢谢!

一起成长,人生是马拉松,可以跑得慢,但一定要在路上。


http://www.kler.cn/a/519451.html

相关文章:

  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.10 文本数据炼金术:从CSV到结构化数组
  • winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件
  • 【精选】基于数据挖掘的招聘信息分析与市场需求预测系统 职位分析、求职者趋势分析 职位匹配、人才趋势、市场需求分析数据挖掘技术 职位需求分析、人才市场趋势预测
  • 记录一个连不上docker中的mysql的问题
  • 深度学习 Pytorch 单层神经网络
  • FreeBSD里制作ubuntu22 jammy兼容环境的脚本
  • 2024-2025年终总结
  • 使用vscode + Roo Code (prev. Roo Cline)+DeepSeek-R1使用一句话需求做了个实验
  • 每日一题-二叉搜索树与双向链表
  • 浏览器IndexedDB占用大
  • HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法
  • rust并发和golang并发比较
  • 二叉搜索树中的搜索(力扣700)
  • Android HandlerThread
  • 【C++基础】多线程并发场景下的同步方法
  • 【Linux-网络】初识计算机网络 Socket套接字 TCP/UDP协议(包含Socket编程实战)
  • GAEA:控制硅基生命如何理解人类
  • 青少年编程与数学 02-007 PostgreSQL数据库应用 14课题、触发器的编写
  • Unity入门2 背景叠层 瓦片规则
  • 与机器学习相关的概率论重要概念的介绍和说明
  • leetcode——缺失的第一个整数(java)
  • iic、spi以及uart
  • 【贪心算法】在有盾牌的情况下能通过每轮伤害的最小值(亚马逊笔试题)
  • Java设计模式 二十六 工厂模式 + 单例模式
  • [ Spring ] Spring Cloud Alibaba Message Stream Binder for RocketMQ 2025
  • 我谈区域偏心率