4

我有以下关系:


路线 * ------ * RouteLeg


我想让它成为一个聚合,因为一个路由是由多个 RouteLegs 组成的。

但是,如果我删除一个 Route,它的 RouteLegs 不一定也会被删除(尽管大多数情况下它们会),因为它们可能会在其他 Routes 中使用。

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

像这样:


路线 * <>---- * RouteLeg


我有这个疑问是因为 Jim Arlow 在其“ UML 2 和统一过程:实用的面向对象分析和设计”一书中,没有将多对多关系视为聚合,但这是有道理的对我来说...

有人有证据表明可以进行多对多聚合吗?首先十分感谢。

4

4 回答 4

3

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


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


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

问题解决了。

于 2010-11-01T19:29:55.450 回答
2

正如 Arlow 所说,多对多不太适合聚合。聚合表示部分-整体关系。它由“有”动词表达。因此,将多对多关系建模为聚合会引入错误的设计。

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

[Route](1)<>---- (1..*)[RouteLeg]

否则,您可以选择将其解耦为一个关联

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

于 2010-10-31T17:44:51.233 回答
1

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

于 2010-10-31T17:43:35.650 回答
0

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

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

于 2010-11-01T05:37:44.080 回答