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

简谈设计模式之代理模式

代理模式是一种结构型设计模式, 主要用于为其他对象提供一种代理, 以控制对这个对象的访问. 代理模式可以在不修改目标对象的前提下, 通过代理对象在访问目标对象之前或之后增加额外的操作

代理模式结构
  1. 抽象主题: 定义了真实主题和代理的共同接口, 这样客户端就可以通过接口来使用真实主题和代理
  2. 真实主题: 定义了代理所代表的真实对象, 是实际进行业务操作的对象
  3. 代理: 持有对真实主题的引用, 控制对真实主题的访问, 可以在访问真实主题时增加额外的操作
代理模式分类
  1. 远程代理: 为一个位于不同地址空间的对象提供本地代表
  2. 虚拟代理: 根据需要创建开销较大的对象, 通过代理来控制对象的访问和延迟初始化
  3. 保护代理: 控制对原始对象的访问, 用于对象有不同访问权限的场景
  4. 智能指引: 在访问实际对象时进行一些额外操作, 例如引用计数, 日志记录等
代理模式实现
// 抽象主题
public interface Subject {void request();
}// 真实主题
public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject: Handling request.");}
}// 代理类
public class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realRequest == null) {realRequest = new RealRequest();}preRequest();realSubject.request();postRequest();}private void preRequest() {System.out.println("Proxy: Pre-processing before forwarding request to RealSubject");}private void postRequest() {System.out.println("Proxy: Post-processing after RealSubject handled request);}
}// 客户端代码
public class Client {public static void main(String[] args) {Subject proxy = new Proxy();proxy.request();}
}

优点:

  • 职责清晰: 代理模式将真实对象和控制访问的代理对象分离, 使得职责更加清晰
  • 透明性: 客户端可以透明地使用代理对象而不需要知道真实对象的存在
  • 控制访问: 代理可以在不修改真实对象的情况下修改对真实对象的访问

缺点:

  • 增加复杂性: 由于引入了代理对象, 会增加系统的复杂性
  • 性能开销: 代理模式可能会增加系统的性能开销, 尤其是远程代理或虚拟代理, 因为它们会增加额外的网络通信或延迟

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 五、 计算机网络(考点篇)
  • 走进linux
  • C语言 | Leetcode C语言题解之第230题二叉搜索树中第K小的元素
  • 我的AI音乐梦:ChatGPT帮我做专辑
  • 【PyTorch单点知识】自动求导机制的原理与实践
  • Apache配置与应用(优化apache)
  • 【Excel】 批量跳转图片
  • C#,开发过程中技术点GPT问答记录
  • 深入理解FFmpeg--libavformat接口使用(一)
  • paddlepaddle2.6,paddleorc2.8,cuda12,cudnn,nccl,python10环境
  • c语言alpha-beta剪枝六子棋
  • 【C++深度探索】全面解析多态性机制(二)
  • 炒鸡清晰的防御综合实验(内含区域划分,安全策略,用户认证,NAT认证,智能选路,域名访问)
  • 【JavaScript脚本宇宙】提升用户体验:探索 JavaScript 命令行界面开发工具
  • LangChain —— Chat Model
  • 【附node操作实例】redis简明入门系列—字符串类型
  • CentOS6 编译安装 redis-3.2.3
  • ES6 学习笔记(一)let,const和解构赋值
  • node 版本过低
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • SAP云平台里Global Account和Sub Account的关系
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 编写符合Python风格的对象
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 删除表内多余的重复数据
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微信开放平台全网发布【失败】的几点排查方法
  • 自制字幕遮挡器
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Java基础复习笔记 第16章:网络编程
  • # Kafka_深入探秘者(2):kafka 生产者
  • #{}和${}的区别是什么 -- java面试
  • #Z2294. 打印树的直径
  • (12)Hive调优——count distinct去重优化
  • (4)事件处理——(7)简单事件(Simple events)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二)原生js案例之数码时钟计时
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (算法)求1到1亿间的质数或素数
  • (转)甲方乙方——赵民谈找工作
  • (转)一些感悟
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • *2 echo、printf、mkdir命令的应用
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .Family_物联网
  • .htaccess配置重写url引擎
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net