2013-11-21 66 views
1

我剛開始學習裝飾模式,我很困惑我什麼時候可以使用裝飾模式,或者爲什麼它不只是調用超級,W/O使用指向超類的指針。裝飾模式vs使用超級

「...是一種設計模式,允許將行爲添加到靜態或動態的單個對象,而不會影響來自同一類的其他對象的行爲。」

是不是隻是子類相同,或者我錯過了什麼?

public class Foo { 
    protected void doSomething() { } 
} 


//using decorator pattern 
public class Bar extends Foo { 
    private foo; 
    public Bar(Foo foo) { 
     this.foo = foo; 
    } 
    public void doSomething() { 
     foo.doSomething(); 
     // extra code 
    } 
} 

//using super 

public class Bar extends Foo { 
    @Overide 
    public void doSomething() { 
     super.doSomething(); 
     // extra code 
    } 
} 

回答

2

你缺少的是你可以創建多個裝飾器並將它們任意組合。

舉例來說,如果你有一個類Window代表一個GUI窗口,並希望能夠增加水平和/或垂直滾動​​條,通過繼承,你可能最終與子類 VerticalScrollingWindowHorizontalScrollingWindowBidirectionalScrollingWindow,如果你也想要添加其他功能,您必須將每個功能作爲所有這些功能的另一個子類和原始Window

但與裝飾,你可以避免這種組合爆炸。你需要一個VerticalScrollDecorator,一個HorizontalScrollDecorator並獲得垂直和水平,你只需要裝飾兩次。如果您有其他功能,則需要爲每個功能添加另一個裝飾器。

+0

直接,簡潔,明確的答案。謝謝! –