是什麼?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 }
public class SimpleWindow implements Window { public void draw() { // Draw window } public String getDescription() { return "simple window"; } }
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(); } }
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"; } }
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"; } }
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); } }
結果:
description:simple window
description:simple window, including horizontal scrollbars
description:simple window, including horizontal scrollbars, including vertical scrollbars
實例:
java.io類包: