Java中的关联、聚合和组合

7
我正在尝试理解这些术语的含义。我提供了一些例子,如下:
聚合:Facebook拥有用户
组合:Facebook中每个用户都有一个会话
关联:人们使用浏览器
但是,我对我的“拥有”和“使用”的例子感到困惑。为什么不能是用户使用Facebook账户或Facebook使用会话来验证用户?
从面向对象编程的角度来看,这样做是否正确?我在哪里错过了概念?

这是一篇不错的文章,可以帮助你理解关联、聚合和组合。 - Anirudha
还有另外一个:这里 - Anirudha
请参考以下基于代码的示例:https://dev59.com/cnRB5IYBdhLWcg3wETxJ#23464244 - Almir Campos
3个回答

8

使用关系有两个含义:

->两者可以独立存在。

->数据从整体分类器(people)流向部分分类器(browser)。

拥有关系有两个含义:

->部分分类器(session)的存活时间依赖于整体分类器(facebook)的存活时间。

->数据通常只在一个方向上流动(即,从整体分类器(facebook)到部分分类器(session))。


5
非常准确。此外,“Association”是一个通用术语;而“Aggregation(使用)”和“Composition(拥有)”是“Association”的类型。 - sbk

2

来自Code Project的这篇文章很好地解释了主题。

首先,没有固定的模型化领域方法,有几种正确的建模方法适用于特定问题。例如,您最初的示例使用了一个Facebook类,在随后的跟进中,您现在使用了Facebook Account类型:使用其中一个(或两个)对您的模型有影响,但不使其无效。

话虽如此,根据Code Project网站,关联关系意味着:

  • 所有者:无所有者
  • 寿命:拥有自己的寿命
  • 子对象:所有子对象都是独立的。

考虑到这一点,我认为UserFacebook Account之间没有关联关系,因为它们高度依赖彼此(假设User指的是Facebook用户),因此组成可能是更好的关系。

我不确定您的Session类是什么意思。如果这是用户连接时段,那么说Facebook使用会话进行身份验证是没有意义的,也许UserSession之间的关联关系可以是聚合,因为用户一天可以有多个会话,并且是所有会话的所有者。


1

请查看这篇维基百科条目,它详细讨论了聚合和组合的区别。

因此,从Java的角度来看,Facebook用户有姓名(组合),而Facebook用户还有一份朋友列表(聚合)。


你的例子很好,我稍微修改了一下,希望能更清晰地表达。我只想提醒一下关于“Association”的使用,在UML术语中是正确的,但在Java中,它基本上意味着调用另一个对象的方法。我之所以强调Java,是因为你在问题中添加了这个标签。 - Miquel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接