比萨模型

时间:2011-11-05 19:42:08

标签: oop uml modeling

我正在尝试创建一个食品订购应用程序。它将从Web服务接收菜单数据(格式尚未确定),并将其转换为订单。

我在制作如何接近比萨饼时遇到了麻烦 - 它们比其他任何东西都复杂,因为你可以选择大小,基础,浇头等。

我想要一个Product类,我可以为菜单中的每个项目创建。然后,该产品将被赋予类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

关于如何实现这一目标的任何想法?

2 个答案:

答案 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个项目(大型或常规),每个项目都有自己的Toppings项目集,其中包含每个项目的配件列表,每个项目都有自己的定价。每个项目可以有多个项目集(很可能需要它们)。我用外壳项目集展示了这个。子项目不必具有自己的定价。一般来说,定价是可加性的,因此顶级商品(披萨)通常具有基本价格,然后选择的子商品在用户选择它们时将其价格添加到基本价格上。

答案 1 :(得分:1)

我建议将Decorator pattern作为起点。

基础比萨类将具有添加酱料,浇头等的属性和方法。装饰者可以修改基础比萨饼的大小。例如,ExtraLargePizza装饰器将改变大小。每个装饰者都应该公开计算比萨饼成本的功能。这是因为装饰者知道它自己的大小。