意图:在不改变原有对象的基础上,动态地将“责任”附加到对象上。装饰者提供了比继承更有弹性的替代方案(扩展原有对象功能)
何时使用:在不想增加很多子类的情况下扩展类。
优点:

  • 比继承更加灵活,在不改变原有对象的基础之上给一个对象扩展功能(原来是用继承来扩展功能,如果功能繁多,必然要用到很多子类,增加系统复杂性,并且使用继承实现功能扩展是静态的,我们必须可预见这些扩展功能,装饰者模式是动态的添加职责!)
  • 通过使用不同的装饰类,以及这些装饰类的组合,可以达到不同的效果。
  • 符合OCP,可以扩展行为,装饰者和被装饰者都能独立变化,原有代码不用改变。

缺点:

  • 增加更多的类,增加程序复杂性
  • 动态装饰和多层装饰会更加复杂

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

实现

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。
RedShapeDecorator 是实现了 ShapeDecorator 的实体类。
DecoratorPatternDemo 类使用 RedShapeDecorator 来装饰 Shape 对象。
装饰器模式 - 图1

装饰器模式 - 图2