设计模式_4:代理模式

这里说的是静态代理模式,想看动态代理模式可以移步来这篇博文:设计模式_25:动态代理模式


假如今天轮到我做班里的值日,那么代码可以这样写:

public class Main {
    public static void main(String[] args) {
        Me me = new Me();
        me.doDuty();
    }
}

interface DoDuty {
    void doDuty();
}

class Me implements DoDuty{

    @Override
    public void doDuty(){
        System.out.println("做值日");
    }
}

如果有人可以代我做值日,那么代码可以改成这样:

public class Main {

    public static void main(String[] args) {
        Helper helper = new Helper(new Me());
        helper.doDuty();
    }
}

interface Doduty {
    void doDuty();
}

class Helper implements Doduty {

    private Me me;

    public Helper(Me me) {
        this.me = me;
    }

    @Override
    public void doDuty() {
        me.doDuty();
    }
}

class Me implements Doduty {

    @Override
    public void doDuty() {
        System.out.println("做值日");
    }
}

上面写的就是代理模式,总的来说代理模式是先定义一个RealSubject(Me)和Proxy(Helper)的公共接口Subject(Doduty),Proxy保存一个RealSubject的引用来使得代理可以访问实体。


2018-02-15更新:

感觉我以前写的博文解析太简单了,现在我自己看了也觉写得很不负责任尴尬,想再补充一点。

还是拿上面做值日的例子:Helper就是我们所说的代理类,Helper的实例就成为代理对象,代理对象的方法叫做代理方法。那么Me就是被代理的类(也称目标类),Me的实例就是被代理对象(目标对象),Me的实例方法就叫作被代理方法(目标方法)。

我们的Me类和Helper类都实现的DoDuty接口,并且Helper实例里有Me实例的引用,当我们调用Helper的doDuty方法时,实际上执行的是Me对象的doDuty方法。

但其实上面的例子并不能实际体现出代理模式有什么作用,那么如果我们在Helper的doDuty方法里改成这样,就应该可以理解了:

public void doDuty(){
    System.out.println("我要帮me做值日!");
    me.doDuty();
    System.out.println("我帮me做完值日啦~");
}
这样,我们可以在me.doDuty前后添加其他逻辑的代码,但又不会影响me.doDuty方法里的代码逻辑(虽然me.doDuty里的方法也就是输出一行字,但实际开发中里面的代码可以很长很复杂)。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值