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

23种设计模式之代理模式

代理模式

1、概念

代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问

代理模式是常用的结构型设计模式之一,在Java RMI、Web Service、Spring AOP等技术和框架中都使用了代理模式

2、代理模式结构

  • Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题
  • Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象。通常,在代理主题角色中客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
  • RealSubject(真实主题角色):它定义了代理角色所代表的真实对象。

代理模式结构图

3、示例

Subject 创建Object接口

public interface Object {void action();
}

RealSubject 创建ObjectImpl类实现Object

public class ObjectImpl implements Object{@Overridepublic void action() {System.out.println("========");System.out.println("========");System.out.println("这是被代理的类");System.out.println("========");System.out.println("========");}
}

Proxy 创建ProxyObject

public class ProxyObject implements Object {private Object obj;public ProxyObject() {System.out.println("这是代理类");obj = new ObjectImpl();}@Overridepublic void action() {System.out.println("代理开始");obj.action();System.out.println("代理结束");}
}

创建测试类

public class Client {public static void main(String[] args) {ProxyObject proxyObject = new ProxyObject();proxyObject.action();}
}

运行结果

这是代理类
代理开始
========
========
这是被代理的类
========
========
代理结束

4、代理模式的优缺点

4.1优点
  • 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
  • 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性
4.2缺点
  • 有些类型的代理模式可能会造成处理速度变慢,例如保护模式
  • 实现代理模式需要额外的工作,有些代理模式的实现过程较为复杂

5、代理模式适用模式

1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表。

2.虚代理(VirtualProxy)根据需要创建开销很大的对象。

3.保护代理(ProtectionProxy)控制对原始对象的访问。

4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。

相关文章:

  • 递归解析 LXML 树并避免重复进入某个节点
  • Plotly : 超好用的Python可视化工具
  • Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
  • 05 Hadoop简单使用
  • 品牌与产品:消费者决策的经济逻辑与品牌宣传的战略意义
  • Keil MDK 下载安装相对应CPU的Software Packs
  • QT6 学生管理系统以及登录(QSQLITE数据库)
  • “探索AIGC市场:腾讯元宝APP加入竞争,大模型产品的未来走向与个人选择“
  • 在 .NET Core 中构建工作服务和调度运行
  • Java 关于抽象 -- Java 语言的抽象类、接口和函数式接口
  • STM32项目分享:智能蓝牙手环
  • 攻防世界--杂项misc-2017_Dating_in_Singapore
  • 力扣爆刷第149天之TOP100五连刷(LRU、K个一组)
  • 专栏【汇总】
  • Ansible——shell模块
  • 5、React组件事件详解
  • CentOS 7 修改主机名
  • docker python 配置
  • ECMAScript6(0):ES6简明参考手册
  • golang 发送GET和POST示例
  • Gradle 5.0 正式版发布
  • IndexedDB
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java Agent 学习笔记
  • Laravel5.4 Queues队列学习
  • MobX
  • python大佬养成计划----difflib模块
  • Python学习之路16-使用API
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpringCloud集成分布式事务LCN (一)
  • Zepto.js源码学习之二
  • 编写高质量JavaScript代码之并发
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 每天10道Java面试题,跟我走,offer有!
  • 如何使用 JavaScript 解析 URL
  • 深度学习中的信息论知识详解
  • 深入浅出webpack学习(1)--核心概念
  • 自制字幕遮挡器
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 阿里云移动端播放器高级功能介绍
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #nginx配置案例
  • (2020)Java后端开发----(面试题和笔试题)
  • (33)STM32——485实验笔记
  • (bean配置类的注解开发)学习Spring的第十三天
  • (笔试题)分解质因式
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (六)DockerCompose安装与配置
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • ****Linux下Mysql的安装和配置