彻底搞懂设计模式DesignPattern-装饰者模式

装饰者模式

定义

  1. 装饰者模式: 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)
  2. 这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。

装饰者模式原理

  1. 装饰者模式就像打包一个快递
    主体: 比如:陶瓷、衣服 (Component) // 被装饰者
    包装:比如:报纸填充、塑料泡沫、纸板、木板(Decorator)
  2. Component
    主体:比如类似前面的Drink
  3. ConcreteComponent和Decorator
    ConcreteComponent:具体的主体,比如前面的各个单品咖啡
    Decorator: 装饰者,比如各调料.
  4. 在如图的Component与ConcreteComponent之间,如果ConcreteComponent类很多,还可以设计一个缓冲层,将共有的部分提取出来,
    抽象层一个类。

UML图

彻底搞懂设计模式DesignPattern-装饰者模式

彻底搞懂设计模式DesignPattern-装饰者模式
彻底搞懂设计模式DesignPattern-装饰者模式

JDK应用的源码分析彻底搞懂设计模式DesignPattern-装饰者模式

适用场景

装饰者模式是以对客户端透明的方式扩展对象的功能,是继承关系的一种替代方案!
以下情况可以考虑是想用对象组合(组合与委托):

在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;

处理那些可以撤消的职责;

当不能采用生成子类的方法进行扩充时:一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类;

优缺点

扩展对象功能,比继承灵活,不会导致类个数急剧增加;
可以通过一种动态的方式在运行时选择不同的具体装饰类,从而实现不同的行为;
避免了高层次类有太多的特征,可以从一个最简单的类慢慢给他添加功能;
会产生很多小装饰者对象,会影响性能,过多使用该模式也会使程序变得复杂。

代码示例

码云地址https://gitee.com/magneto/codeReview/tree/master/DesignPattern/src/pro51/top/adapter

微信
彻底搞懂设计模式DesignPattern-装饰者模式

个人网站
http://www.51pro.top
彻底搞懂设计模式DesignPattern-装饰者模式
公众号
彻底搞懂设计模式DesignPattern-装饰者模式