设计模式之代理模式

定义(百度百科):
      为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

UML类图:

 

具体代码:

public class Client {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);
        proxy.request();
    }
}

public class Proxy {
    Subject realSubject = null;
    Proxy(Subject realSubject) {
        this.realSubject = realSubject;
    }

    void request() {
        System.out.println("代理类");
        realSubject.request();
    }
}

public class RealSubject implements Subject {

    @Override
    public void request() {
        System.out.println("request");
    }
}

public interface Subject {
    void request();
}

模块说明:
Subject抽象主题:声明真实主题和代理主题的共同接口。
RealSubject真实主题:定义代理对象需要代理的真实对象。
Proxy代理主题:代替真实对象来控制对真实对象的访问,代理对象持有真实对象的应用,从而可以随时控制客户端对真实对象的访问。

相关实例:
代理模式大家都是程序员都懂的FQ,就是挂的代理服务器。
具体到代码层面,spring的动态代理,java原生的动态代理,cglib的动态代理等等(关于这三先挖个坑,以后来填)。

适用场景:
它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。

优缺点:
优点:
能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。

缺点:
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,例如保护代理。
实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂,例如远程代理。

总结:
代理模式实质是控制对象的访问。

posted @ 2017-08-03 15:01  重名  阅读(270)  评论(0编辑  收藏  举报