装饰模式的定义
定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说,装饰模式相比生成子类更为灵活.
通俗的说,就是对一个类或方法进行包装
装饰模式的通用类图:

类图中的四个角色说明如下:
- Component 抽象构件: Component是一个接口或抽象类,就是定义我们最核心的角色,也就是最原始的对象. 在装饰模式中,必然有一个最基本、最核心的接口或抽象类充当 Component 抽象构件
- ConcreteComponent 具体构件: ConcreteComponent 是最核心、最原始、最基本的接口或抽象类的实现,要装饰的就是它
- Decorator 装饰角色: 一般是一个抽象类,实现接口或抽象方法,它里面不一定有抽象的方法,在它的属性中必然有一个private变量指向Component抽象构件
- 具体装饰类: ConcreateDecrator是具体的装饰类,要把最核心的、最原始的、最基本的东西装饰成其他东西. 当只有一个装饰类时,可以没有抽象装饰角色
具体实现代码如下:


抽象装饰者代码:

具体装饰者代码:

场景类:

装饰模式应用
装饰模式的优点:
- 装饰类和被装饰类可以独立发展,而不会相互耦合. 也就是说,Component 类无需知道 Decorator 类,Decorator 类是从外部来扩展 Component类的功能,而Decorator也不用知道具体的构件
- 装饰模式是继承关系的一个替代方案. 我们看装饰类 Decorator,不管装饰多少层,返回的对象还是 Component.
- 装饰模式可以动态的扩展一个实现类的功能
装饰模式的缺点:
对于装饰模式记住一点就够了: 多层的装饰是比较复杂的.
装饰模式的应用场景:
装饰模式是对继承的有力补充. 要知道继承不是万能的,在项目中要考虑诸如易维护、易扩展、易复用等,而且在一些情况下要是用继承就会增加很多子类,而且灵活性非常差,当然维护也不容易了,也就是说装饰模式可以替代继承,解决类膨胀的问题. 同时,继承是静态的给类增加功能,而装饰模式是动态的增加功能.
装饰模式还有一个非常好的优点: 扩展性非常好.