2014-01-29 31 views
0

在學習裝飾圖案我被困在鹼性疑問如下改編職系裝飾圖案,對象實例化

背景:http://www.newthinktank.com/2012/09/decorator-design-pattern-tutorial/

  • 披薩 - >接口(PlainPizza & TopingDecorator(抽象類)實現它)
  • TomatoSauce和奶酪延伸TopingDecorator
  • ToppingDecorator有一個實例字段披薩

問題:代碼執行程序如何讀取以下代碼?我試圖回答它,請確認它是否正確。

  1. TomatoSauce構造函數創建其傳遞莫薩里拉乾酪目的是它的超級
  2. 其超強(即TopingDecorator)對象創建的Mozzarella對象(使用它的構造)通過PlainPizza對象作爲參數傳遞給它的超級。
  3. 只要實例化普通比薩餅對象,它就存儲在Mozzarella對象的比薩餅實例字段中。
  4. 然後這個莫扎里拉對象被存儲在TomatoSauce的實例字段中。現在,TomatoSauce對象的實例化已完成。

所以,番茄醬對象的超級包含馬蘇裏拉對象。而那個Mozzarella Object的超級對象包含PlainPizza對象。

Pizza basicPizza = new TomatoSauce(new Mozzarella(new PlainPizza())); 

回答

0

你幾乎在那裏與你的理解。

Pizza basicPizza = new TomatoSauce(new Mozzarella(new PlainPizza())); 
  • 首先,PlainPizza對象將被創建
  • 其次,Mozzarella構造函數將通過傳遞新創建的plainpizza被調用。
  • 現在,Mozzarella構造函數將調用super(newPizza);,這將設置newPizzaToppingDecorator的實例變量。
  • 現在,實際的Mozzarella對象創建完成。

由於Mozzerellais-aPizzaTomotoSauce構造函數可以把它和調用ToppingDecorator的構造函數,並設置mozerellaToppingDecorator

現在,來到decorator pattern,它改變了Pizza單個實例的行爲。

當您調用方法basicPizza.getDescription();時,您的輸出將爲Thin dough, mozzarella, tomato sauce。這意味着你用mozzarellatomato sauce包裝Thin dough行爲。

如果您只是想用Mozzarella來修飾PlainPizza,則可以在不更改任何實施的情況下執行以下操作。

Pizza onlyMozzarella = new Mozzarella(new PlainPizza()); 

希望它不會讓你更加困惑。

+0

所以它不是從TomatoSauce的構造函數開始的?它從最內層的參數開始..這是Java中的規則? –

+0

它首先解決最內部變量或方法或代碼。 –