面临问题:
要使用的对象将执行所需的基本功能。但是,在这些基本功能确定以后,可能需要为这个对象添加一些其他附加功能,并且对于不同的情况可能添加附加功能的种类和数量都是不确定的。
也就是说如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展化”所导致的影响将为最低?
解决方案:
通过添加装饰类,而不是扩展子类,在运行时为基本类对象扩充功能。
Component
定义一个对象接口,可以给这些对象动态地添加职责
ConcreteComponent
定义一个对象,可以给这个对象添加一些职责,也就是可以给这个对象进行装饰。
Decorator
维持一个指向Component对象的指针,并定义一个与
Component接口一致的接口
ConcreteDecorator
向组件添加职责
因为在ConcreteDecorator的对象中,构造函数中包含了component对象传进来一个参数。自己的属性中也有component的定义。所以在ConcreteDecorator实现operation方法中,自己的行为再加上传入的component对象的行为,才是这个operation方法的实现。
对一个component对象一步步进行装饰完之后,调用最后的方法时候,会一步步回调回去。例如计算价格等等。看不懂的可以参考head first 设计模式 98页。
装饰者模式通过继承统一了装饰者和被装饰者的接口,通过聚合获得了在运行时动态扩展被装饰者对象的能力。
通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。符合结构型模式!!
相关的模式
Adapter:Decorator模式中装饰仅改变对象的职责而不改变它的接口,而Adapter模式中适配器将给对象一个全新的接口
Composite:可以将装饰视为一个退化的仅有一个组件的组合,Decorator的目的不在于对象聚集
Strategy:用一个装饰可以改变对象的外表,而Strategy模式可以改变对象的内核