代理模式(Proxy Pattern)
一、概念
代理模式(Proxy Pattern)是指用一个代理类来包装具体实现类,由代理类代替目标类执行,从而为目标类增加一些额外的功能、处理。
- 简单说就是:在操作一个对象和对象中的方法时,不是直接操作这个对象,而是通过一个代理对象来操作这个目标对象,在调用代理方法前后或者抛出异常增加一些额外处理
二、适用场景
一般是需要在执行某个已经写好的方法前后加一些与业务本身无关的逻辑
,比如执行方法前打印日志,或者在执行方法之后打印方法的执行时间,诸如此类的。
三、参与者
- Subject(抽象主题角色/共同接口): 通过
接口
或抽象类
定义代理角色与真实角色要共同实现
的业务方法(代理类和被代理类都要实现该接口
) - RealSubject(真实主题角色/真实对象/被代理对象):
实现了抽象角色
,定义真实角色所要实现的业务逻辑,供代理角色调用 - Proxy(代理主题角色/代理对象):
实现了抽象角色
,是真实角色的代理,需要持有真实角色的引用
,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 - Client 用户
四、代码例子
当点击下查看原图或稍等一会就会加载出原始高清图片,未加载时的小图片其实就可以通过代理模式实现,原图则是被代理的实例对象
Subject(抽象主题角色/共同接口): PhotoInfo
RealSubject(真实主题角色/真实对象/被代理对象): BigPhoto
Proxy(代理主题角色/代理对象): BigPhotoProxy
五、UML图
六、优缺点
(一)优点
- 代理模式能将代理对象与真实被调用的目标对象分离。
- 可以在不修改被代理对象代码的前提下对代理对象的方法进行功能增强,符合开闭原则
(二)缺点
- 根据实现方式的不同,对代码都有一定的侵入性,比如静态代理要侵入代理类的实例,jdk代理需要侵入Proxy类,而Cglib代理则需要侵入子类子类对象创建等代码。
七、与其他模式比较
(一)代理模式和装饰者模式的不同
- 装饰器模式:强调的是增强自身,增强后你还是你,只不过能力更强了而已。
- 代理模式:强调要让别人(代理类)帮你去做一些本身与你业务没有太多关系的职责(记录日志、设置缓存)
(二)代理模式和外观模式的不同
- 代理模式:是为了实现对象的控制,因为被代理的对象往往难以直接获得或者是其内部不想暴露出来。
- 外观模式:定义了一个高层接口,为多个子系统中的接口提供一个一致的界面,不对目标功能进行增强。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了