定义
动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。
角色
抽象构件类(Component):声明了具体构件的业务方法。
具体构件类(ConcreteComponent):用于定义具体的构件对象。
抽象装饰类( Decorator ):它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰前的构件对象方法,并通过其子类扩展该方法,已达到装饰目的。
具体装饰类(ConcreteDecorator):负责向构件添加新的职责。它既可以调用构件类的方法,又可以执行扩充方法。
优点
对于扩展一个对象的功能,装饰模式比继承更加灵活,不会导致类的个数急剧增加
可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体装饰类,从而实现不同的行为
可以对一个对象进行多次装饰
具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,且原有类库代码无须改变,符合开闭原则
缺点
使用装饰模式进行系统设计时将产生很多小对象,大量小对象的产生势必会占用更多的系统资源,在一定程度上影响程序的性能
比继承更加易于出错,排错也更困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐
适用场景
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式
案例
某软件公司基于面向对象技术开发了一套图形界面构件库——VisualComponent,该构件库提供了大量基本构件,如窗体、文本框、列表框等,由于在使用该构件库时,用户经常要求定制一些特殊的显示效果,如带滚动条的窗体、带黑色边框的文本框、既带滚动条又带黑色边框的列表框等等,因此经常需要对该构件库进行扩展以增强其功能。现使用装饰模式来设计该图形界面构件库。