关联与聚合

mak*_*aks 30 java oop uml

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

小智 148

有四种类关系

  1. 关联: 使用
    Ex:一个类Man使用一个类Pen(当人死亡时笔仍在那里)
  2. 聚合: 有一个
    Ex:一个类Man有一个类Car(当人死时汽车仍在那里)
  3. 构成: 拥有一个
    Ex:一个类Man拥有一个类Heart(当人死,心死)
  4. 继承: 是一个
    Ex:一个类Man是一个类Human(人类是一个人类)

对象类之间的关系

继承>组成>聚合>协会

  • 用*contains*替换*owns*可能更好.可以认为*owns*对应于聚合. (18认同)
  • +1,但聚合和关联之间的区别很少混淆 - 一个人*大多数*也可以*有笔*和*使用汽车*.所有权很重要.更好的例子:男人去医院,agregn - 男人有车. (5认同)

Mar*_*ten 24

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

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

聚合,聚合对象继续存在.(想想订单< - >产品,产品继续生活).

组合,聚合对象与所有者一起死亡.(想想段落< - >文件,段落随文件而死).

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

  • 正确,聚合和组合是与所涉及对象的生命周期相关的区别. (2认同)

kha*_*hik 10

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

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

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


Kos*_*Kos 5

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

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

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

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