设计模式6之代理模式

关于代理模式 , 很好理解 。 比如你买演唱会的票 , 自己很难买到 , 只能去找黄牛 , 那么黄牛就是代理(非官方)卖火车票的 。
在开发中 , 代理模式很常见 。 一个类的对象不直接生成 , 通过代理类去帮你生成对象 。 那么通过代理生成的对象的功能可能会有增强 。 一般我们想让一个对象的功能增强 , 就可以使用代理模式 。
什么是代理模式“
Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问 。 )

我认为代理模式有几个很有用的作用:
“能保护目标对象 , 我们不直接访问目标对象 , 而是通过代理对象访问代理对象可以扩展目标对象的功能”
客户端不能直接访问目标对象 , 只能通过代理对象访问 , 势必会降低访问速度 。 同时增加了代理对象 , 系统的复杂度也增加了 。
那么代理模式有哪些要素组成呢?
“抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法 。 真实主题(Real Subject)类:实现了抽象主题中的具体业务 , 是代理对象所代表的真实对象 , 是最终要引用的对象 。 代理(Proxy)类:提供了与真实主题相同的接口 , 其内部含有对真实主题的引用 , 它可以访问、控制或扩展真实主题的功能 。 ”
这几种要素关系如下图:
设计模式6之代理模式文章插图
代理模式
代码实现下面是代码:
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之代理模式】面试必问的动态代理 , 我们来看看它们的源码