动态 地给一个对象 添加一些额外的职责 。就增加功能来说,decorator模式相比生成子类更为灵活。
对于对象功能的扩展, 面向对象一般通过继承来解决, 但这种方式缺乏灵活性, 而且随意定义子类容易导致类层次结构过快膨胀.
场景, 当类的核心职责和主要行为没有发生变化, 仅仅需要动态对类对象添加一些装饰性的功能, 比如给人穿衣服......
如下图所示, 只是为图画换换边框, 这种改动只需要使用下面介绍的装饰模式.
装饰模式实现, 如下代码,
客户代码使用,
装饰模式如下图, 我们可以创建一个抽象decorator类, 然后根据需要创建许多的concretedecroator类. 而decorator类可以装饰任意component类.
而且decorator类只是对核心类对象进行动态装饰, 不会影响到核心类本身, 所以可以任意装饰, 加成员变量, 调用其他函数, 如concretedecroatora, concretedecroatorb.
且decorator类本身也是component类, 所以可以嵌套装饰, 非常的强大,
装饰模式的好处,
首先, 有效的将类的核心职能和装饰功能区分开了, 动态装饰完全不会影响核心类 便于维护, 可复用性强.
其次, 有效的解决了子类的快速膨胀的问题, 如果单纯用继承来解决问题, 不但对于装饰a,b,......各需要子类, 而且对于各种装饰的组合也需要创建子类. 当装饰种类很多时, 可想而知那会创建非常多的子类. 而使用装饰模式, 只需要对每个装饰生成子类, 而装饰的组合和搭配只需要嵌套使用装饰模式就可以达成.
这个模式还是很实用, 很强大的, 可以用于很多场景......
本文章摘自博客园,原文发布日期:2013-02-05