修飾模式(Decorator Pattern)
阿新 • • 發佈:2019-01-01
private des 面向 sys scroll 修飾 rac 按鈕 oid
是什麽?
怎麽用?
在什麽情況下用?
實際例子!
修飾模式:
在面向對象的編程中,一種動態的向類裏添加新行為的設計模式。
比如:
window窗口系統,我們需要往裏面添加豎直方向和水平方向的滾動條,如果全部code全寫在同一個類(方法)裏,那以後擴展或者修改某一個模塊功能就很有可能影響到原有的其他功能,所以就需要用到修飾模式。
再比如:
coffee店的coffee配置,卡布奇洛和拿鐵雖然都是咖啡,但它們的原料配比不同、售價也不同。如果全寫在同一個類裏,如果以後增加其他咖啡了,就得動以前的code,會有影響其他代碼的風險,所以需要修飾模式。
原理:
增加一個修飾類包裹原來的類,包裹的方式一般是將原來的類的作為修飾類的構造參數 。
window窗口系統:
Window 是抽象組件,所有的修飾類或修飾組件都繼承這個接口類。
SimpleWindow 是具體組件,所有其他負責的窗口(有滾動條的窗口、有按鈕的窗口等)都是修飾這個最基本的窗口而來的。
WindowDecorator 是抽象修飾者,他和SimpleWindow是一樣的,但它是個抽象類。為什麽會需要這個抽象類呢?因為所有的修飾者都是繼承這個類的,修飾者按照多態方式分別實現了不同的行為!
VerticalScrollBar、HorizontalScrollBar 是具體的修飾類。
維基百科code:
public interfaceWindowWindow { public void draw(); // Draws the Window public String getDescription(); // Returns a description of the 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)