设计模式摘要(核心篇)三、装饰者模式

定义:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

模式类图

作用

使用对象组合的方式,在运行时装饰类。一旦熟悉了装饰技巧,你将能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。

注意点

  • 每个地方都采用开闭原则,是一种浪费。不仅没必要,还会导致代码变得复杂且难以理解。
  • 虽然我们用到了继承,但是这么做的重点在于,装饰者和被装饰者必须是一样的类型,也就是有共同的超类。在这里,我们利用继承达到“类型匹配”,而不是利用继承获得“行为”。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。
  • 如果依赖继承,那么类的行为只能在编译时静态决定。换句话说,行为如果不是来自超类,就是子类覆盖后的版本。反之,利用组合,可以把装饰者混合着用……而且是在“运行时”。
  • 装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。
  • 你可以争辩说,使用装饰者模式,必须管理更多的对象,所以犯下编码错误的机会会增加。但是,装饰者通常是用其他类似于工厂或生成器这样的模式创建的。它们会“封装得很好”,所以不会有这种问题。
  • 有些代码依赖特定的类型,要谨慎考虑

OO 原则

  • 开闭原则:类应该对扩展开放,对修改关闭

模式应用

场景

咖啡店里有几种咖啡,客户购买咖啡时,可以要求加入各种调料,例如:蒸奶、豆浆、摩卡或覆盖奶泡。咖啡店会根据所加入的调料收取不同的费用。

应用类图

参考代码:装饰者模式