关联与聚合

时间:2010-11-28 18:08:40

标签: java oop uml

我已经回顾了很多关于这些事情的信息,但是无法理解它们之间有什么区别?在Fowler的UML Distilled中说,Aggreagation绝对没有意义,因此作者建议不要在图表中使用它。 请解释一下,何时我应该使用它们以及它将如何影响java代码。

6 个答案:

答案 0 :(得分:147)

有四种类关系

  1. 协会:使用
    例如:班级Man使用班级Pen(当人死亡时,笔仍在那里)
  2. 聚合:
    例如:一个班级Man有一个班级Car(汽车是 当人死的时候还在那里)
  3. 成分:拥有
    例如:一个班级Man拥有一个班级Heart(当人类 死,心死)
  4. 继承:
    例如:班级Man是班级Human(人类是人类)
  5. 对象类之间的关系

    <强>继承与GT;组合物&gt;综合与GT;协会

答案 1 :(得分:24)

关联意味着两个类有某种关系,可能是真的。

组合和聚合是两种关联。区分他们的最简单方法是考虑这种关系“有多难”。想一想当删除所有者对象时会发生什么。

聚合,聚合对象继续存在。 (想想订单&lt; - &gt;产品,产品继续存在)。

组合,聚合对象与所有者一起死亡。 (想想段落&lt; - &gt;文档,段落随文档而死)。

聚合可以被认为是没有意义的,因为在绘制具有非填充箭头(关联)的线和具有非填充菱形(聚合)的线之间没有太大区别。关系非常相似。然而,填充钻石(成分)的线条非常不同。

答案 2 :(得分:10)

这是一个非常有争议的问题。作为Martin explains in the answer,订单汇总了产品。这可以认为是真的。 Grady Booch在他的“面向对象的分析和设计”中提供了一个类似的关联示例 - 销售与该销售中的产品相关联,反之亦然。销售不会聚合产品。因此,所有示例都应该是特定于域的,因为从另一个角度来看,关联可能变得更具体。另一个例子是使用段落的文档组成。

所以这个领域的一切都很大程度上取决于背景。这是OOP。

您可以尝试将您的知识应用于您要设计的特定项目。我建议你阅读Grady Booch的书,如果你还没有这样做的话。自那以来,已经写了很多书,但它仍然是OO *的圣经。

答案 3 :(得分:3)

UML组合,聚合和普通关联是语义概念,而不是编程概念。它们的含义可以理解如下:

  • 成分:A由B组成; B是A的一部分,因此没有A
  • 就不能存在
  • 聚合:A拥有B,B属于A
  • 关联:A使用B,A以给定方式与B相关

(组合和聚合是特殊类型的关联。)

在Java中,您可以以相同的方式实现所有这些。这是一个概念上的差异。

答案 4 :(得分:2)

关联是类之间的任何关系,其中一个类的实例具有对另一个类的实例的字段引用。

组合是一种“更强大”的关系,意味着一个实例(父母)“拥有”另一个(孩子)。

聚合除了作为关联之外没有任何其他语义。

在此处查看更多内容:http://martinfowler.com/bliki/AggregationAndComposition.html

编辑:您可以向聚合符号添加一些特殊语义,例如“一次最多只能拥有一个父级,但可能会更改父级,或者是孤儿”。但是,据我所知,这些扩展是您自己的,并且在UML中没有定义。

答案 5 :(得分:0)

关于哪个词是哪个,似乎存在争议。

它与对象之间的父子关系以及删除父对象时孩子会发生什么有关。

一种情况是,孩子的生命不在父母的生命之外,因此在删除父母时应删除他们。在外键和关系数据库中考虑“DELETE CASCADE”。

另一种情况是,孩子应该坚持超越父母,因此在删除父母时不应删除孩子。

我会留给其他人来争论哪个词描述每种情况。