代理设计模式与装饰设计模式的对比

写上一篇文章的时候查了一下相关的资料,结果突然发现对于代理设计模式与装饰设计模式有点混淆,百度搜索的结果也不是很明确,都是说代理设计模式重在对与代理对象的控制,而装饰设计模式重在对装饰对象的增强,其实这么说没有什么问题,但是稍微抽象了一些,为了便于理解,我们可以分别写一下来对比看看。
其实在代理设计模式里比较容易跟装饰设计模式混淆的是静态代理,两个都是在被代理或者装饰的对象外面套了一层,然后自己实现方法的时候调用成员变量的方法举一个例子来说明一下:比如在一个异次元的古代,碰巧是封建帝制,大臣向皇帝呈折子的时候需要经过太监来转交,而这个皇帝比较昏庸,太监就为非作歹,许多折子就暗中扣下,不呈交皇帝,或者替换奏折,翻译成代码就是下面这样。

// 静态代理
// 大臣,相当于被代理的类
public class DaChen {
  public String zouZhe() {
    return "启禀皇上balabala";
  }
}
// 太监,相当于代理类
public class TaiJian {
  private DaChen daChen;
  public TaiJian(DaChen daChen) {
    this.daChen = daChen;
  }
  public String piYue() {
    Random random = new Random();
    // 太监看心情呈奏折子
    if(random.nextBoolean()) {
      return daChen.zouZhe();
    } else {
      return "皇上,今天没有折子!";
    }
  }
}
// 皇上,最终结果
public class HuangShang {
  public static void main(String[] args) {
    // 大臣呈递奏折ing
    DaChen daChen = new DaChen();
    TaiJian taiJian = new TaiJian(daChen);
    // 皇上勤政ing
    for (int i = 0; i < 5; i++) {
      System.out.println(taiJian.piYue());
    }
  }
}
// 执行结果
皇上,今天没有折子!
皇上,今天没有折子!
皇上,今天没有折子!
启禀皇上balabala
皇上,今天没有折子!

Process finished with exit code 0

五个折子竟然只呈递了一个,这个太监的心情不太好啊,从这里可以明显的看出代理的侧重在控制上,他可以决定代理对象的执行与否,下面我们再看装饰设计模式。还是同样的场景,只不过是皇帝颁旨,太监去宣旨,那太监肯定是挑高大上的词来说了。

// 装饰设计模式
// 皇帝,相当于被装饰的类
public class HuangShang {
  public String banZhi() {
    return "表现不错,赏";
  }
}
// 太监,相当于装饰类
public class TaiJian {
  private HuangShang huangShang;
  public TaiJian(HuangShang huangShang) {
    this.huangShang = huangShang;
  }
  public String xuanZhi() {
    System.out.println("奉天承运,皇帝诏曰:");
    return huangShang.banZhi();
  }
}
// 大臣,相当于调用装饰的类
public class DaChen {
  public static void main(String[] args) {
    // 皇帝下旨ing
    HuangShang huangShang = new HuangShang();
    TaiJian taiJian = new TaiJian(huangShang);
    // 接旨ing
    System.out.println(taiJian.xuanZhi());
  }
}
// 结果
奉天承运,皇帝诏曰:
表现不错,赏

Process finished with exit code 0

这里可以看到,太监不敢矫造圣旨,所以圣旨内容没有改变,只是在前面说了句“奉天承运,皇帝诏曰:”,这里体现的就是装饰设计模式的增强功能,并不会更改被装饰对象的方法,而是增强他。
其实并没有严格的规定要求代理不能增强,装饰不能控制,只是说侧重增强的是装饰设计模式,侧重控制的是代理,实际使用中也可以混用,设计模式就是为了方便实现逻辑的,没必要硬凑设计模式而放弃了简便,所以说这两者的区别就在于使用的意义侧重。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值