多对多关系可以是聚合吗? [简单问题]

时间:2010-10-31 17:22:23

标签: uml aggregation

我有以下关系:


路线* ------ * RouteLeg


我想将此作为聚合,因为路由由多个RouteLegs组成。

但是,如果我删除了一个Route,它的RouteLegs也不一定会被删除(尽管大部分时间都是这样),因为它们可能会在其他路由中使用。

将此关系显示为聚合是否合适?

像这样:


路线*<> ---- * RouteLeg


我有这样的疑问,因为Jim Arlow在其“ UML 2和统一过程:实用的面向对象分析和设计”一书中看不到多少 - 许多关系作为聚合,但对我来说是有意义的......

任何人都有证据表明可以进行多对多汇总吗? 非常感谢提前。

4 个答案:

答案 0 :(得分:3)

毕竟,Arlow没有说多对多关系不能成为聚合。事实上,他为此提供了一个例子:


产品*<> ---- *产品


奇怪的是我第一次没注意到它......感谢回复。

问题解决了。

答案 1 :(得分:2)

正如Arlow所说,多对多并不适合聚合。聚合代表整体关系。它是用“有一个”动词来表达的。因此,将多对多关系建模为聚合会引入错误的设计。

解决方案取决于您的设计决策。我认为Route-RouteLeg关系更像是一对多的关系。路由“有”一个(或多个)RouteLegs,但RouteLeg似乎不适合多个路由,我的意思是设计明智而不是编程明智。

[路线](1)<> ----(1 .. *)[RouteLeg]

否则,您可以选择将其解除为关联

〔路线](0 .. *)----(1 .. *)[RouteLeg]

答案 2 :(得分:1)

这是一种关联,因为聚合对于多对多关系确实没有意义。在聚合中,通常一方具有零个或多个另一方,而另一方仅属于一个聚合。除了RouteLeg可能属于至少一条路线的事实之外,你有多对多的关系,双方都没有真正控制另一方。但是,由于RouteLeg可能由多个路由共享,因此它可能不属于任何路由,也可能不受任何单个路由控制。我会说你应该坚持使用一个关联,因为它是指定的两种类型之间的正确“连接”。

答案 3 :(得分:0)

聚合是一种比关联更强的关系,但比组合弱。在合成中,整个和部分对象的生命周期是相互关联的(如果你删除了整个部分,你也应该删除它们)但是在聚合中不一定是这种情况。

因此,理论上您可以使用聚合来表示您的场景