设计模式——装饰者模式

Posted boycelee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——装饰者模式相关的知识,希望对你有一定的参考价值。

- 什么是装饰者模型

装饰者模型通过组合的方式扩展对象的特性,动态地给对象添加额外的职责。在增加功能上,装饰模式比生成子类更加灵活。

- 职责划分

  1. Component抽象构建,是接口或者抽象类,就是定义原始对象。
  2. ConcreteComponent具体构件,是原始对象的实现,也就是被装饰者,我们需要装饰的就是它。
  3. Decorator装饰角色,一般是一个抽象类,实现接口或者抽象方法,它里面不移动有抽象方法,在他的属性里面必然有private变量指向Component构件。
  4. 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)排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。




以上是关于设计模式——装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-装饰者模式(Go语言描述)

设计模式-装饰者模式(Go语言描述)

设计模式整理_装饰者模式

设计模式 之 装饰者模式

装饰者模式

设计模式之装饰者模式