我已经回顾了很多关于这些事情的信息,但是无法理解它们之间有什么区别?在Fowler的UML Distilled中说,Aggreagation绝对没有意义,因此作者建议不要在图表中使用它。 请解释一下,何时我应该使用它们以及它将如何影响java代码。
答案 0 :(得分:147)
有四种类关系
Man
使用班级Pen
(当人死亡时,笔仍在那里)Man
有一个班级Car
(汽车是
当人死的时候还在那里)Man
拥有一个班级Heart
(当人类
死,心死)Man
是班级Human
(人类是人类)对象类之间的关系
<强>继承与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组合,聚合和普通关联是语义概念,而不是编程概念。它们的含义可以理解如下:
(组合和聚合是特殊类型的关联。)
在Java中,您可以以相同的方式实现所有这些。这是一个概念上的差异。
答案 4 :(得分:2)
关联是类之间的任何关系,其中一个类的实例具有对另一个类的实例的字段引用。
组合是一种“更强大”的关系,意味着一个实例(父母)“拥有”另一个(孩子)。
聚合除了作为关联之外没有任何其他语义。
在此处查看更多内容:http://martinfowler.com/bliki/AggregationAndComposition.html
编辑:您可以向聚合符号添加一些特殊语义,例如“一次最多只能拥有一个父级,但可能会更改父级,或者是孤儿”。但是,据我所知,这些扩展是您自己的,并且在UML中没有定义。
答案 5 :(得分:0)
关于哪个词是哪个,似乎存在争议。
它与对象之间的父子关系以及删除父对象时孩子会发生什么有关。
一种情况是,孩子的生命不在父母的生命之外,因此在删除父母时应删除他们。在外键和关系数据库中考虑“DELETE CASCADE”。
另一种情况是,孩子应该坚持超越父母,因此在删除父母时不应删除孩子。
我会留给其他人来争论哪个词描述每种情况。