代理模式与装饰者模式区别

如果你还在纠结代理模式和装饰者模式区别,我奉劝你别纠结了。
静态代理和装饰者模式没区别,代码一模一样。
代理模式只有在动态代理和装饰者模式才会有很大区别。

静态代理和装饰者:
两个class A、B。A通过与B相同的method(方法名称相同,签名相同),在调用A的method时来调用B的method,同时夹带私货执行自己的功能。(一般情况下通过实现相同接口来实现,但是为了便于理解,这里就不引入接口的概念了)

class B{
  public void doSomething(){
    //todo
  }
}

class A{
  private B b;
  public A(B b){
    this.b = b;
  }
  public void doSomething(){
    this.b.doSomething();

    //夹带私货,执行自己的业务
    System.out.println("wow")
  }
}

静态代理和装饰者模式没多大区别,基本上就是这个模子。


举个大白活栗子:
你去租房子,一开始是房东太太和你谈,但是她什么都不了解话也说不清楚,然后她打电话叫他老公来帮她,她老公在旁边指导她,最后谈成了。这就是装饰者模式。
你去租房子,一开始是房东太太和你谈,但是她什么都不了解话也说不清楚,然后她打电话叫他老公 和你谈,她躲到后面去,等他老公和你谈完之后,她老公再回头告诉她谈的结果,她一听还不错,她同意了,然后他老公再告诉你谈成了。这就是代理模式。

但是仔细研究一下就会发现,代理模式和装饰者模式在代码上没多大区别。(不使用动态代理情况下),只是思想不一样:

  • 装饰者模式强调用新的class来包裹旧的class,从而实现对旧的class的功能的增强或新增。特征就是发生了结构变化,也就是A的doSomething发生变化,但是依旧包含执行了B的doSomething
  • 代理模式强调“代理”,使用者使用代理对象时,会感觉和被代理对象毫无差异,但是代理对象确实行使了被代理对象的权力。特征就是出现的新对象,代理行使旧对象的所有功能。
posted @ 2021-03-15 14:16  麦块程序猿  阅读(904)  评论(0编辑  收藏  举报