一、装饰模式定义
动态地给一个对象增加一些额外的职责,就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。
说明:装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。
在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩展原有类的功能。
二、装饰模式的结构
1)抽象构件(Component)
是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法。
2)具体构件(ConcreteComponent)
是抽象构件类的子类,用于定义具体的构件对象,实现了抽象构件中声明的方法,装饰类可以给它增加额外的方法。
3) 抽象装饰类(Decorator)
是抽象构件类的子类,用于给具体构件增加额外的方法,但是具体方法常在其子类中实现。
4) 具体装饰类(ConcreteDecorator)
是抽象装饰类的子类,负责向构件中添加新的方法。
三、装饰模式应用实例
开发一套图形界面构件库Visual Component,库中提供大量的基本构件,如窗体,文本框,列表框等。并且使得构件库具有可扩展性。
使用装饰模式来设计图形界面构件库。
其中,VisualComponent充当抽象构件类,其子类Window、TextBox、ListBox充当具体构件类;VisualComponent的另一子类ComponentDecorator充当抽象装饰类,它的子类ScrollBarDecorator和BlackBorderDecorator充当具体装饰类。
实例代码下载链接:http://download.csdn.net/detail/qq_30507287/9553473
四、透明装饰模式和半透明装饰模式
两者主要区别在于对客户端代码中,使用抽象构件类型定义对象的差异。也就是在定义对象时要将对象定义为抽象构件。
透明装饰模式定义对象(见应用实例):
Component component1,component2;
半透明装饰模式定义对象:
Component component;
ComponentDecorator component2;
五、装饰模式的优点
1)便于扩展,可采用动态方式进行扩张;
2)可对一个对象进行多次装饰;
3)具体构件类和具体装饰构件类可以独立窗体变化,符合开闭原则。
缺点是:需要定义过多的对象,会占用系统资源。