我对代理模式的理解

我在学校迎新晚会上见到一个跳舞的女生,第一眼就想把她占为己有,可是我与她素不相识,只能找其他同学偷偷要来她的联系方式。这就是代理模式

概念

我们来看一下head first设计模式里是怎么定义代理模式的:代理模式为另一个对象提供一个替身或占位符以控制这个对象的访问。使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。

如何实现

拿我追女生的例子来说,我就是委托对象,那个认识她的同学就是代理,我让他去帮我要电话,本质上是我在要电话,最后的结果也是我要到了电话,而事实上却是他找她要的电话。对于代理模式的调用者来说,是我在要电话而并不关注要电话的那个代理,这里大家肯定觉得很熟悉,没错,我们采用了面向接口编程的思想,调用者只需要使用接口中的方法,不用在乎具体的实现类。
因此,我们可以先创建一个委托接口,接口中有一个要电话的抽象方法。然后写一个‘我’对象继承自这个接口,实现要电话的方法;再写一个代理类同样实现这个委托接口,在这个代理类中注入‘我’的实例,调用‘我’中的方法去实现接口方法。总结为一张图:


我对代理模式的理解_第1张图片

代码实现

定义委托接口

public interface Subject{
    void getCall();
}

定义‘我’

public class Me implements Subject{
    @Override
    public void getCall() {
        System.out.println("我想要你的电话");
    }

}

定义代理

public class Proxy implements Subject{
    private Subject subject;
    public Proxy(Subject subject) {
        this.subject = subject;
    }
    @Override
    public void getCall() {
        subject.getCall();
    }
}

测试

public class ProxyTest {
    public static void main(String[] args) {
        Me me = new Me();
        Subject proxy = new Proxy(me);
        proxy.getCall();
    }
}

输出结果:

我对代理模式的理解_第2张图片
image.png

代理模式的好处

代理模式的优势在于当你需要添加或修改新的业务功能 ,不需要修改原来的代码,即上述代码中的Me类,而是通过添加新的类来代理之前的逻辑,这也是所有设计模式的基本原则:可以加,不能改。

你可能感兴趣的:(我对代理模式的理解)