Uml 类图:聚合还是组合

Uml 类图:聚合还是组合,uml,aggregation,composition,class-diagram,Uml,Aggregation,Composition,Class Diagram,我正在做一个关于类图的作业,下面显示了类顺序和菜单项之间的关联。链接应该是聚合(弱)还是组合(强) 我很困惑,因为我看到了显示聚合的示例。我觉得它应该是一个组合,作为一个订单必须至少添加一个菜单项。我错了吗 链接应该是聚合(弱)还是组合(强) 两者都可以。主要区别在于: 如果是一篇作文: MenuItem对象在Order对象的实例化时实例化 一旦Order对象被销毁,MenuItem对象就会被销毁 C++示例: class Order { MenuItem menus[NUMBER_

我正在做一个关于类图的作业,下面显示了类
顺序
菜单项
之间的关联。链接应该是聚合(弱)还是组合(强)

我很困惑,因为我看到了显示聚合的示例。我觉得它应该是一个组合,作为一个
订单
必须至少添加一个
菜单项
。我错了吗

链接应该是聚合(弱)还是组合(强)

两者都可以。主要区别在于:

如果是一篇作文:

  • MenuItem对象在Order对象的实例化时实例化
  • 一旦Order对象被销毁,MenuItem对象就会被销毁

  • C++示例:

    class Order {
        MenuItem menus[NUMBER_OF_MENUS];
    };
    
    class Order {
        MenuItem* menus[NUMBER_OF_MENUS];
    };
    
如果是聚合:

  • MenuItem对象的生存期与Order对象的生存期无关

  • C++示例:

    class Order {
        MenuItem menus[NUMBER_OF_MENUS];
    };
    
    class Order {
        MenuItem* menus[NUMBER_OF_MENUS];
    };
    

所以这是一个设计决策。也可能取决于实现语言。例如,在Java中,两者之间没有区别,所有的对象变量都是引用。

很多都依赖于上下文。让我们用一个例子来说明两者的区别

假设您正在汽车工厂组装汽车对象。汽车对象有两个轴对象、四个车轮对象、一个马达对象等。所有这些对象只有在整个汽车的上下文中才有意义(一旦你把它们放进去,它们就留在那里)。这就是作文


现在,假设你在垃圾场里有一个汽车物体。汽车物体也有同样的东西,但你可以把轮子、车轴或马达拉出,然后分别出售。在这种情况下,每个零件的使用寿命都与汽车的使用寿命不同。这就是聚合。

你的导师的里程数可能会有所不同,但我的一位教授曾经说过:“聚合和合成之间的区别极其微妙,定义不清,完全取决于个人的理解。当您绘制UML类图时,决定使用聚合或组合,但不要浪费任何进一步的思考。每当你遇到一个同时包含这两种功能的图表时,不要假设作者想通过区别来表达任何特定的东西,而是假设作者在不同的时间意外地点击了不同的按钮。“也许这有帮助;)而OP的问题(没有车,但订单和菜单项)的答案是?哇。问题的答案是”很多都取决于上下文。“如果您想为OP详细说明不同的上下文,请继续。我更愿意给出一个类似的背景,其中区别是显而易见的。如果你发现这在教学上不合理,请详细解释原因。现在,我已经尽我所能去适应你过去多刺和刻薄的个性,我现在要求你至少在将来避免讽刺、自大和/或不尊重的评论。恐怕我受够了。先谢谢你,恕我冒犯。OP的问题不仅是关于抽象术语聚合与组合的问题,这已经被回答了很多次,而且是关于
顺序
菜单项
的具体例子。你的答案如何比@sergej的答案更完整更好?为什么一定要这样?这不是故意的,只是从另一个角度看待同一件事。有时候,当人们用不止一种方式解释事情时,他们会更容易理解。OP显示了一个图表,说明该图表显示了Order和Menu Item两个类之间的关联。她提到它将它们显示为构图。她提到,她也看到了使用聚合的示例,并询问哪一个是正确的。那么,哪一个是正确的,组合还是聚合?她猜测这可能是组合,因为订单总是需要一个菜单项。那么,在哪里有人回答了使用聚合还是组合的问题呢?我已经给了一些提示。我可以告诉她吗?我倒希望她能明白。。。