修飾模式(Decorator Pattern)


 

是什麼?java

怎麼用?編程

在什麼狀況下用?設計模式

實際例子!ide


 

修飾模式:函數

  在面向對象的編程中,一種動態的向類裏添加新行爲的設計模式。this

  好比:spa

    window窗口系統,咱們須要往裏面添加豎直方向和水平方向的滾動條,若是所有code全寫在同一個類(方法)裏,那之後擴展或者修改某一個模塊功能就頗有可能影響到原有的其餘功能,因此就須要用到修飾模式。設計

  再好比:code

    coffee店的coffee配置,卡布奇洛和拿鐵雖然都是咖啡,但它們的原料配比不一樣、售價也不一樣。若是全寫在同一個類裏,若是之後增長其餘咖啡了,就得動之前的code,會有影響其餘代碼的風險,因此須要修飾模式。對象

 

原理:

  增長一個修飾類包裹原來的類,包裹的方式通常是將原來的類的做爲修飾類的構造參數

  window窗口系統:

  

  Window 是抽象組件,全部的修飾類或修飾組件都繼承這個接口類。

  SimpleWindow 是具體組件,全部其餘負責的窗口(有滾動條的窗口、有按鈕的窗口等)都是修飾這個最基本的窗口而來的。

  WindowDecorator 是抽象修飾者,他和SimpleWindow是同樣的,但它是個抽象類。爲何會須要這個抽象類呢?由於全部的修飾者都是繼承這個類的,修飾者按照多態方式分別實現了不一樣的行爲!

  VerticalScrollBar、HorizontalScrollBar 是具體的修飾類。

 

維基百科code:

public interface Window {
    public void draw(); // Draws the Window
    public String getDescription(); // Returns a description of the Window
}
Window
public class SimpleWindow implements Window {
    public void draw() {
        // Draw window
    }

    public String getDescription() {
        return "simple window";
    }
}
SimpleWindow
public abstract class WindowDecorator implements Window {
    protected Window decoratedWindow; // the Window being decorated

    //在構造函數中將SimpleWindow包裹起來
    public WindowDecorator (Window decoratedWindow) {
        this.decoratedWindow = decoratedWindow;
    }
    
    @Override
    public void draw() {
        decoratedWindow.draw();
    }

    @Override
    public String getDescription() {
        return decoratedWindow.getDescription();
    }
}
WindowDecorator
public class VerticalScrollBar extends WindowDecorator {
    public VerticalScrollBar(Window windowToBeDecorated) {
        super(windowToBeDecorated);
    }

    @Override
    public void draw() {
        super.draw();
        drawVerticalScrollBar();
    }

    private void drawVerticalScrollBar() {
        // Draw the vertical scrollbar
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", including vertical scrollbars";
    }
}
VerticalScrollBar
public class HorizontalScrollBar extends WindowDecorator1 {
    public HorizontalScrollBar (Window windowToBeDecorated) {
        super(windowToBeDecorated);
    }

    @Override
    public void draw() {
        super.draw();
        drawHorizontalScrollBar();
    }

    private void drawHorizontalScrollBar() {
        // Draw the horizontal scrollbar
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", including horizontal scrollbars";
    }
}
HorizontalScrollBar
public class Main {
    // for print descriptions of the window subclasses
    static void printInfo(Window w) {
        System.out.println("description:"+w.getDescription());
    }
    public static void main(String[] args) {
        // original SimpleWindow
        SimpleWindow sw = new SimpleWindow();
        printInfo(sw);
        // HorizontalScrollBar  mixed Window
        HorizontalScrollBar hbw = new HorizontalScrollBar(sw);
        printInfo(hbw);
        // VerticalScrollBar mixed Window
        VerticalScrollBar vbw = new VerticalScrollBar(hbw);
        printInfo(vbw);
    }
}
Main

結果:

description:simple window
description:simple window, including horizontal scrollbars
description:simple window, including horizontal scrollbars, including vertical scrollbars

 

實例:

  java.io類包:

 

相關文章
相關標籤/搜索