2011-11-05 25 views
2

我正在嘗試創建一個食品訂購應用程序。它將從webservice(格式尚未確定)接收菜單數據,並將其轉換爲訂單。建模比薩

我無法制定出如何處理比薩餅 - 他們是比什麼都更復雜,你可以選擇大小,底座,澆頭等

我想有一類產品,這是我可以爲菜單中的每個項目創建。然後,這個產品將被賦予類Size和Option的對象。這允許創建比薩餅,設置其大小(例如,常規/大/ xl)和一組澆頭(選項)。

我需要,不知何故,Option對象知道什麼是產品的大小。我需要這樣做,因爲頂級比薩的價格可能是5英鎊,但相同的頂級價格是7英鎊。理想情況下,Option不是Size的元素,因爲可用選項對於每個尺寸都保持不變 - 只有價格發生變化。

我的(可能是錯誤的)模型是這樣的:http://yuml.me/diagram/scruffy/class/%5BPizza%5D-%3E%5BToppings%5D,%20%5BPizza%5D-%3E%5BSize%5D

我如何能做到這一點任何想法?

+0

爲什麼不讓**尺寸** **產品**類的屬性之一? – Tadeck

+1

這真的取決於你想用比薩做什麼。 – hugomg

回答

1

我建議以Decorator pattern爲起點。

基地比薩類將具有用於添加醬料,澆頭等的屬性和方法。裝飾者可以修改基地比薩的大小。例如,ExtraLargePizza裝飾器將更改大小。每個裝飾者應該公開用於計算比薩成本的功能。這是因爲裝飾者知道自己的大小。

+0

這看起來非常有趣,我可以理解這是如何工作的。我一定會放棄這個方法。謝謝! – Josh

+0

不客氣。很高興幫助! –

2

在實際編寫軟件來處理這個問題之後,我發現有子項代表最佳選擇。實質上,允許項目有多組子項目,然後這些子項目可以有多組子項目等等。每個選項實際上只是另一個項目(它有一個名稱和一個價格),只有它是與另一個項目有關。所以,在你的榜樣,它可能是這樣的:

Pizza (Item) 
|--> Size (ItemSet) 
|  |--> Large ($15) (Item) 
|  |  |--> Toppings (ItemSet) 
|  |    |--> Pepperoni ($7) (Item) 
|  |    |--> Anchovies ($7) (Item) 
|  |--> Regular ($10) (Item) 
|    |--> Toppings (ItemSet) 
|     |--> Pepperoni ($4) (Item) 
|     |--> Anchovies ($4) (Item) 
|--> Crust (ItemSet) 
     |--> Thin (Item) 
     |--> Deep-Dish (Item) 

薄餅項目的大小套裝,其中包含2項(大量或經常),每個都有自己的澆頭套裝,其中包含列表每個都有自己的定價。您可以爲每個項目設置多個項目集(並且很可能需要它們)。我用地殼項目集展示了這一點。子項目不必擁有自己的定價。通常,定價是附加的,所以頂級商品(披薩)通常具有基準價格,然後在用戶選擇它們時選擇的子商品將其價格添加到底價上。

+0

感謝您的回覆。如果可能的話,我不想這樣做,儘管我可能不得不這樣做。我將首先給裝飾者模式一個去。 – Josh