2011-12-27 141 views
6

使用維基百科(http://en.wikipedia.org/wiki/Decorator_pattern)上顯示的咖啡裝飾例子如何有可能讓某人能夠擁有隻有裝飾者有的方法,例如,牛奶裝飾可以有一個方法稱爲「fatContent」。這種設計模式甚至可能嗎?如果不是,我可以用什麼樣的模式來完成這個?裝飾模式與裝飾特定的方法在Java

+0

我不知道那種設計模式。老實說,我不喜歡它。 – 2011-12-27 13:55:00

+0

@MartijnCourteaux維基百科的咖啡例子是從書[Your Brain On Design Patterns]中提取的(http://headfirstlabs.com/books/hfdp/)。但它只包含一小部分,沒有進一步解釋。我推薦這個講座來全面瞭解這個模式。 – Beccari 2011-12-27 14:13:09

+1

@MartijnCourteaux裝飾??它是最有用的*模式之一,IMO。 – 2011-12-27 14:23:45

回答

3

根據定義,Decorator模式不允許添加接口中定義的方法以外的方法。實際上,您可以隨時向任何類添加方法,但是一旦這些方法未在實現接口中定義,客戶端就無法使用此接口調用它們。

簡單的解決您的問題是定義幾個接口,例如,咖啡和牛奶。然後,您可以定義類Capuchino,該類實現了兩個接口並可能包含2個實例:SimpleCofeeFoamedMilk。但是這個解決方案更像是Decorator和Facade的組合。

4

裝飾者可以有任何數量的具體方法。您可能會引入一個裝飾器特定的接口,裝飾器除了實現裝飾性接口外還會實現該接口。

然而,有人知道這些方法存在,因此無論是裝飾有內部調用方法,調用方必須知道它使用裝飾的裝飾對象,而不是(你可以測試使用instanceof)或使用反射來檢查這些方法。

9

可能,但你要知道,以實際呼叫方法(假設沒有反射等),如果它不符合你繞過類型的類型。

類型確定在編譯時已知什麼:如果CoffeeDecorater不包含fatContent簽名,則沒有任何接收CoffeeDecoractor的人知道該方法存在。

您可以創建一個額外的界面,但您需要知道它存在以便您可以檢查它(instanceof),或詢問該類以檢查特定簽名(反射)。

Java或者知道在編譯時存在一個方法,或者在運行時檢查它。