设计模式故事——装饰者模式

3 装饰者模式

场景:

小佑的篮球卖的非常红火,想推出一些签名款,比如说小狮子和小老虎的签名篮球,当然价格要改变。

不用装饰者模式的思路:
新增小狮子签名篮球子类,新增小老虎签名篮球子类。在计算价格的时候覆盖篮球类的方法,增加价格。
看起来不错。但是每增加一种签名篮球都要新增一个类。

也可以在篮球类中增加两个变量:是否有小狮子签名,是否有小老虎签名。再在cost函数中计算。

但是这明显不符合开闭原则。(对拓展开放,对修改关闭)
首先增加签名种类,要不断修改篮球类的变量和方法,篮球类过于庞大。此外,子类还要实现很多不相关的方法,因为篮球类加入的新功能不适用于所有的篮球子类。

引入装饰者模式

首先抽象出一个新的类——附着物类表示出了篮球本身加上其他的东西。
附着物类继承自篮球类,是一个装饰者类。
小狮子签名类继承自附着物类。类内组合进一个被装饰者——一个篮球对象(可以是红色蓝色绿色无所谓,甚至可以是一个签过名的篮球)。
在计算cost的时候用签名价格+篮球.cost()即可。
其他内容也可以同样逻辑修饰。

装饰者模式的直观感受是将被装饰者包裹起来,也不关注被装饰者的内容,只要类型符合规范即可。

我可以用小狮子签名篮球包裹一个小狮子签名篮球。成为一个小狮子签两次名的篮球。

这波小赚,附着物类不仅可以用作签名,以后加点别的东西也是可以的。

总结

装饰者模式是除了继承之外,扩展行为的另一种方式。
Java中比较典型的装饰者案例是InputStream
各种各样的InputStream可以互相装饰。

猜你喜欢

转载自blog.csdn.net/tianyouououou/article/details/106223078