1. 程式人生 > >修飾模式(Decorator Pattern)

修飾模式(Decorator Pattern)

private des 面向 sys scroll 修飾 rac 按鈕 oid


是什麽?

怎麽用?

在什麽情況下用?

實際例子!


修飾模式:

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

  比如:

    window窗口系統,我們需要往裏面添加豎直方向和水平方向的滾動條,如果全部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類包:

技術分享圖片

技術分享圖片

修飾模式(Decorator Pattern)