设计模式6之代理模式
关于代理模式 , 很好理解 。 比如你买演唱会的票 , 自己很难买到 , 只能去找黄牛 , 那么黄牛就是代理(非官方)卖火车票的 。
在开发中 , 代理模式很常见 。 一个类的对象不直接生成 , 通过代理类去帮你生成对象 。 那么通过代理生成的对象的功能可能会有增强 。 一般我们想让一个对象的功能增强 , 就可以使用代理模式 。
什么是代理模式“
Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问 。 )
”
我认为代理模式有几个很有用的作用:
“能保护目标对象 , 我们不直接访问目标对象 , 而是通过代理对象访问代理对象可以扩展目标对象的功能”
客户端不能直接访问目标对象 , 只能通过代理对象访问 , 势必会降低访问速度 。 同时增加了代理对象 , 系统的复杂度也增加了 。
那么代理模式有哪些要素组成呢?
“抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法 。 真实主题(Real Subject)类:实现了抽象主题中的具体业务 , 是代理对象所代表的真实对象 , 是最终要引用的对象 。 代理(Proxy)类:提供了与真实主题相同的接口 , 其内部含有对真实主题的引用 , 它可以访问、控制或扩展真实主题的功能 。 ”
这几种要素关系如下图:
文章插图
代理模式
代码实现下面是代码:
Subjectpublic interface Subject {void request();}
Proxypublic class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}preRequest();realSubject.request();postRequest();}public void preRequest() {System.out.println("访问真实主题之前的预处理!!!");}public void postRequest() {System.out.println("访问真实主题之后的后续处理!!!");}}
RealSubjectpublic class RealSubject implements Subject {@Overridepublic void request() {System.out.println("真实类访问方法!!!!");}}
测试如下:
public class ProxyTest {public static void main(String[] args){Proxy proxy = new Proxy();proxy.request();}}
访问真实主题之前的预处理!!!真实类访问方法!!!!访问真实主题之后的后续处理!!!
关于动态代理代理模式的比较高级的应用 , 可以参考我的这篇文章:
【设计模式6之代理模式】面试必问的动态代理 , 我们来看看它们的源码
- 手机“飞行模式”为何没被淘汰?内行人坦言:其实是你不会用
- 百度App“看听模式”上线新功能,人人都可成新闻主播
- 菜贩子大数据“杀熟”,支持刘强东“卖菜”,互联网模式所向披靡
- 运动计数开发项目的对抗赛:飞算全自动软件工程平台碾压传统模式
- 莆田:科技与创意引领制鞋新模式
- 华为开启“暴走”模式!三个大动作同时展开,国产芯片将迎来破冰
- 送餐机器人等创新模式助力餐饮行业复苏发展
- 青少年|封面评论 |“青少年模式”依旧漏洞百出,标准化合规框架必须落地
- 聊聊网易云音乐:“心动模式”
- Windows 10端Chromium改善防病毒软件兼容性和深色模式