设计模式6之代理模式

关于代理模式,很好理解。比如你买演唱会的票,自己很难买到,只能去找黄牛,那么黄牛就是代理(非官方)卖火车票的。

在开发中,代理模式很常见。一个类的对象不直接生成,通过代理类去帮你生成对象。那么通过代理生成的对像的功能可能会有增强。一般我们想让一个对象的功能增强,就可以使用代理模式。

什么是代理模式

Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。)

我认为代理模式有几个很有用的作用:

  • 能保护目标对象,我们不直接访问目标对象,而是通过代理对象访问

  • 代理对象可以扩展目标对象的功能

客户端不能直接访问目标对象,只能通过代理对象访问,势必会降低访问速度。同时增加了代理对象,系统的复杂度也增加了。

那么代理模式有哪些要素组成呢?

  1. 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。

  2. 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

  3. 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

这几种要素关系如下图:

代理模式

代码实现

下面是代码:

Subject

public interface Subject {
    void request();
}

Proxy

public class Proxy implements Subject {

    private RealSubject realSubject;

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.request();
        postRequest();
    }

    public void preRequest() {
        System.out.println("访问真实主题之前的预处理!!!");
    }

    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理!!!");
    }
}

RealSubject

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("真实类访问方法!!!!");
    }
}

测试如下:

public class ProxyTest {
    public static void main(String[] args){
        Proxy proxy = new Proxy();
        proxy.request();
    }
}
访问真实主题之前的预处理!!!
真实类访问方法!!!!
访问真实主题之后的后续处理!!!

关于动态代理

代理模式的比较高级的应用,可以参考我的这篇文章:

面试必问的动态代理

猜你喜欢

转载自blog.csdn.net/wujialv/article/details/109020806