1. 程式人生 > >設計模式——裝飾者模式

設計模式——裝飾者模式

什麽 很多 方法 info 改變 劃分 llb 設計 nts

- 什麽是裝飾者模型

裝飾者模型通過組合的方式擴展對象的特性,動態地給對象添加額外的職責。在增加功能上,裝飾模式比生成子類更加靈活。

- 職責劃分

  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)排錯也很困難,對於多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為煩瑣。

設計模式——裝飾者模式