【问题标题】:Modelling a Pizza比萨建模
【发布时间】:2011-12-22 19:02:15
【问题描述】:

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

我无法弄清楚如何处理比萨饼 - 它们比其他任何东西都更复杂,因为您可以选择大小、底料、浇头等。

我想要一个 Product 类,我可以为菜单中的每个项目创建它。然后,该产品将被赋予 Size 和 Option 类的对象。这允许创建比萨饼,设置其大小(例如常规/大/xl)和一组浇头(选项)。

不知何故,我需要 Option 对象知道 Product 的 Size 是多少。我需要这样做,因为普通比萨的浇头可能要花费 5 英镑,但同样的浇头要花费 7 英镑来制作大披萨。理想情况下,Option 不会是 Size 的一个元素,因为每种尺寸的可用选项都保持不变——只有价格会发生变化。

我的(可能是错误的)模型如下所示:http://yuml.me/diagram/scruffy/class/%5BPizza%5D-%3E%5BToppings%5D,%20%5BPizza%5D-%3E%5BSize%5D

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

【问题讨论】:

  • 为什么不把 size 作为 Product 类的属性之一?
  • 这真的取决于你想用披萨做什么。

标签: oop uml modeling


【解决方案1】:

我建议将Decorator pattern 作为起点。

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

【讨论】:

  • 这看起来很有趣,我可以理解它是如何工作的。我肯定会尝试这种方法。谢谢!
【解决方案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)

Pizza 项目有一个 Size 项目集,其中包含 2 个项目(大的或常规的),每个项目都有自己的 Toppings 项目集,其中包含每个浇头的列表,每个都有自己的定价。每个项目可以有多个项目集(并且很可能需要它们)。我用外壳项集展示了这个。子项目不必有自己的定价。通常定价是累加的,因此顶级项目(比萨饼)通常具有底价,然后选择的子项目在用户选择时将其价格添加到底价上。

【讨论】:

  • 感谢您的回复。如果可能的话,我不想这样做,尽管我可能不得不这样做。我先试试装饰器模式。
猜你喜欢
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
相关资源
最近更新 更多