2011-11-05 24 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