定义
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
继承添加新功能:使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。
关联添加新功能:B对象引用A对象,由B对象决定是否来扩展A对象的行为
关联不会破坏类的封装性,可以为类动态添加职责
模式结构
Component: 定义一个对象接口,可以给这些对象动态的添加职责
ConcreteComponent: 定义一个具体的对象,也可以给这个对象添加职责
Decorate:装饰抽象类, 从外类扩展Component的功能,但对于Component来说,是无需知道Decorate的存在
ConcreteDecorateA: 具体的装饰对象,起到给Component添加职责
模式实现
场景: 一个人穿衣服, 要求穿鞋子,带帽子
场景分析:可以先穿鞋子后带帽子, 也可以先带帽子后穿鞋子,顺序是可以变的
实现效果 : 在运行时,不用修改给定对象的结构就可以在外部增加附加的功能
下载代码, 解压后目录下图:
优缺点
优点:
在不改变原有代码的情况下,把类的核心功能和装饰功能区分开了,并能动态扩展一个对象的新功能
缺点:
对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。
使用场景
当某个对象的职责经常发生变化或者需要动态的增加职责