意图:在不改变原有对象的基础上,动态地将“责任”附加到对象上。装饰者提供了比继承更有弹性的替代方案(扩展原有对象功能)
何时使用:在不想增加很多子类的情况下扩展类。
优点:
- 比继承更加灵活,在不改变原有对象的基础之上给一个对象扩展功能(原来是用继承来扩展功能,如果功能繁多,必然要用到很多子类,增加系统复杂性,并且使用继承实现功能扩展是静态的,我们必须可预见这些扩展功能,装饰者模式是动态的添加职责!)
- 通过使用不同的装饰类,以及这些装饰类的组合,可以达到不同的效果。
- 符合OCP,可以扩展行为,装饰者和被装饰者都能独立变化,原有代码不用改变。
缺点:
- 增加更多的类,增加程序复杂性
- 动态装饰和多层装饰会更加复杂
使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。
实现
我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。
RedShapeDecorator 是实现了 ShapeDecorator 的实体类。
DecoratorPatternDemo 类使用 RedShapeDecorator 来装饰 Shape 对象。