我对代理模式的理解

来源:互联网 发布:天刀男捏脸数据公子羽 编辑:程序博客网 时间:2024/06/06 01:36

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

概念

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

如何实现

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

代码实现

定义委托接口

public interface Subject{    void getCall();}

定义‘我’

public class Me implements Subject{    @Override    public void getCall() {        // TODO Auto-generated method stub        System.out.println("我想要你的电话");    }}

定义代理

public class Proxy implements Subject{    private Subject subject;    public Proxy(Subject subject) {        // TODO Auto-generated constructor stub        this.subject = subject;    }    @Override    public void getCall() {        // TODO Auto-generated method stub        subject.getCall();    }}

测试

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

输出结果:

image.png