我已经查阅了很多关于这些内容的信息,但是不明白它们之间的区别在哪里?在Fowler的UML Distilled中,作者表示聚合(Aggregation)毫无意义,因此建议在图表中不要使用。
请解释一下,我应该何时使用它们以及如何影响Java代码。
类之间有四种关系:
Man
使用一个类Pen
(当人死亡时笔仍然存在)Man
拥有一个类Car
(当人死亡时汽车仍然存在)Man
拥有一个类Heart
(当人死亡时心脏也会停止工作)Man
是一个类Human
(人类是人的一种)类之间的关系
继承 > 组合 > 聚合 > 关联
关联(Association)指两个类之间存在某种关系,可以是任何类型的关系。
组合(Composition)和聚合(Aggregation)是两种关联方式。最简单的区分它们的方法是考虑“关系的强度”,即在删除拥有者对象时会发生什么。
聚合中,被聚合的对象会继续存在。(比如订单与产品,产品会继续存在)。
组合中,被组合的对象随着拥有者的消亡而消亡。(比如段落与文档,段落将随着文档的销毁而消失)。
有人认为聚合是没有意义的,因为用一个没有填充的箭头(关联)和一个没有填充的菱形(聚合)连接两个类并没有太大的区别。这两种关系非常相似。但是带有填充菱形的线(组合)则非常不同。
UML组合、聚合和简单关联是语义概念,而不是编程概念。它们的含义可以理解为:
(组合和聚合是关联的特殊类型。)
在Java中,您可以以相同的方式实现所有这些内容。这是一个概念上的区别。
关于哪个词是哪个词似乎存在一些争议。
这与对象之间的父子关系有关,以及在删除父对象时子对象会发生什么。
其中一种情况认为,子对象在父对象之外没有生命,因此当删除父对象时应该同时删除子对象。类似于外键和关系型数据库中的“DELETE CASCADE”。
另一种情况认为,子对象应该在父对象之外继续存在,因此当删除父对象时不应该删除子对象。
我将让其他人争论哪个词描述了每种情况。
关于关联,聚合和组合的区别
可能会对您有用。 - Iman Mahmoudinasab