- 什么是装饰者模型
装饰者模型通过组合的方式扩展对象的特性,动态地给对象添加额外的职责。在增加功能上,装饰模式比生成子类更加灵活。
- 职责划分
- Component抽象构建,是接口或者抽象类,就是定义原始对象。
- ConcreteComponent具体构件,是原始对象的实现,也就是被装饰者,我们需要装饰的就是它。
- Decorator装饰角色,一般是一个抽象类,实现接口或者抽象方法,它里面不移动有抽象方法,在他的属性里面必然有private变量指向Component构件。
- ConcreteDecoratorA,具体的装饰类,把原始对象进行修饰
- 装饰者模式UML图
被修饰接口Window 对应 Component
public interface IWindow {
void draw();
String getDescription();
}
被修饰者SimpleWindow 对应 ConcreteComponent
public class SimpleWindow implements IWindow {
@Override
public void draw() {
logger.info("SimpleWindow draw")
}
@Override
public String getDescription() {
return "SimpleWindow Description";
}
}
装饰角色WindowDecorator 对应 Decorator
public abstract class WindowDecorator implements IWindow{
private IWindow window;
public WindowDecorator(IWindow window) {
this.window = window;
}
@Override
public void draw() {
window.draw();
}
@Override
public String getDescription() {
return window.getDescription();
}
}
具体装饰类IoDecorator 对应 ConcreteDecoratorA
public class IoDecorator extends WindowDecorator {
public HorizontalScrollBarDecorator(IWindow window) {
super(window);
}
@Override
public void draw() {
super.draw();
logger.info("Io draw");
}
@Override
public String getDescription() {
return super.getDescription() + "IO";
}
}
优点:
(1)装饰者模式可以提供比继承更多的灵活性
(2)具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。
缺点:
(1)会产生很多的小对象,增加了系统的复杂性
(2)排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。