概述
- 装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。
- 在装饰模式中,“具体组件”类和“具体装饰”类是该模式中最重要的两个角色。
- “具体组件”类的实例称作“被装饰者”,“具体装饰”类的实例称为“装饰者”。
- “具体装饰”类需要包含有“具体组件”类的一个实例的引用,以便装饰“被装饰者”。
装饰模式的结构
装饰模式的结构中包括四种角色。
- 抽象组件(Component)
- 具体组件(ConcreteComponent)
- 装饰(Decorator)
- 具体装饰(ConcreteDecotator)
抽象组件(Component)
- 抽象组件是一个抽象类。
- 抽象组件定义了“被装饰者”需要进行“装饰”的方法。
具体组件(ConcreteComponent)
- 具体组件是抽象组件的一个子类。
- 具体组件的实例称作“被装饰者”。
装饰(Decorator)
- 装饰也是抽象组件的一个子类,但装饰还包含一个抽象组件声明的变量以保存“被装饰者”的引用。
- 装饰可以是抽象类也可以是一个非抽象类,如果是非抽象类,那么该类的实例称作“装饰者”。
具体装饰(ConcreteDecotator)
- 具体装饰是装饰的一个非抽象子类,具体装饰的实例称作“装饰者”。
装饰模式相对继承机制的优势
- 我们知道,通过继承也可以改进对象的行为,对于某些简单的问题这样做未尝不可,但是如果考虑到系统扩展性,就应当注意面向对象的一个基本原则之一:少用继承,多用组合。
- 使用继承机制设计的这个系统面临着一个巨大的挑战,那就是用户需求的变化。
装饰模式的优点
- 被装饰者和装饰者是松耦合关系。
- 由于装饰(Decorator)仅仅依赖于抽象组件(Component),因此具体装饰只知道它要装饰的对象是抽象组件某一个子类的实例,但不需要知道是哪一个具体子类。
- 装饰模式满足“开-闭原则”。
- 不必修改具体组件,就可以增加新的针对该具体组件的具体装饰。
- 可以使用多个具体装饰来装饰具体组件的实例。
适合使用装饰模式的情景
- 程序希望动态地增强类的某个对象的功能,而又不影响到该类的其他对象。
- 采用继承来增强对象功能不利于系统的扩展和维护。