Java 关联与聚合

Java 关联与聚合,java,oop,uml,Java,Oop,Uml,我已经回顾了很多关于这些东西的信息,但不明白它们之间的区别是什么?在Fowler的UML中,他说聚集是毫无意义的,所以作者建议不要在图中使用它。 请解释一下,我应该在什么时候使用它们,以及它们对java代码的影响。关于哪个词是哪个词,似乎有一些争论 它与对象之间的父子关系以及删除父对象时对子对象的影响有关 有一种情况是,孩子们在父母之外没有生命,所以当父母被删除时,他们应该被删除。考虑外键和关系数据库中的“删除级联” 另一种情况是,子对象应该在其父对象之外持续存在,因此在删除其父对象时不应删除它

我已经回顾了很多关于这些东西的信息,但不明白它们之间的区别是什么?在Fowler的UML中,他说聚集是毫无意义的,所以作者建议不要在图中使用它。
请解释一下,我应该在什么时候使用它们,以及它们对java代码的影响。

关于哪个词是哪个词,似乎有一些争论

它与对象之间的父子关系以及删除父对象时对子对象的影响有关

有一种情况是,孩子们在父母之外没有生命,所以当父母被删除时,他们应该被删除。考虑外键和关系数据库中的“删除级联”

另一种情况是,子对象应该在其父对象之外持续存在,因此在删除其父对象时不应删除它们


我将让其他人来讨论哪个词描述了每种情况。

关联意味着两个类有某种关系,可能是任何东西

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

聚合,则聚合对象继续存在。(想想订购产品,产品会继续存在)

合成时,聚合对象与所有者一起死亡。(想想文档中的段落,段落会随着文档一起消失)


聚合可以被认为是无意义的,因为使用非填充箭头(关联)绘制直线与使用非填充菱形绘制直线(聚合)之间没有太大区别。两者的关系非常相似。但是,带填充菱形的线(组合)是非常不同的。

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

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

聚合除了作为一个关联之外没有任何附加语义

请参阅此处的更多信息:


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

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

  • 组成:A由B组成;B是a的一部分,因此没有a就不可能存在
  • 聚合:A拥有B,B属于A
  • 关联:A使用B,A以给定方式与B相关
(组合和聚合是特殊类型的关联。)


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

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

因此,这个领域的一切都强烈地依赖于上下文。这是OOP


您可以尝试将您的知识应用到您将要设计的特定项目中。如果你还没有读过Grady Booch的书,我建议你读一读。从那以后写了很多书,但它仍然是OO的圣经*

有四种阶级关系

  • 关联:使用
    例:一个阶级
    使用一支阶级
    (人死后笔还在那里)
  • 聚合:具有一个
    例:一个阶级
    有一个阶级
    (车是 (人死的时候还在那里)
  • 构成:拥有一个
    例:一个阶级
    拥有一颗阶级
    (当人 死,心死)
  • 继承:是一种
    例:一个阶级
    就是一个阶级
    (人就是人)
  • 对象类之间的关系


    继承>组合>聚合>关联

    您可能不应该用OOP和UML来标记它。这些术语在OOP中的含义与在UML中的含义不同。不,UML是一种图形化的面向对象设计符号,因此它们的含义应该是相同的。UML不仅仅是一种图形符号。(虽然,图形符号似乎是唯一有用的部分)这篇文章可能有用。据我所知,当A使用B(或A知道B)时,这是一种依赖关系。。。但是,上面所有的不是都引入了依赖性吗?但你是对的,“A知道B”太模糊了,无法描述关联。IIRC,关联在对象之间,依赖在类之间-如果我错了请纠正我。根据“依赖是当某个元素或一组元素需要(需要)时使用的定向关系”用于规范或实现的其他模型元素。这意味着依赖元素的完整语义在语义或结构上依赖于“供应商元素”。据我所知,依赖关系既可以存在于类之间,也可以存在于对象之间。在我看来,这种描述是在类之间的——类A的规范或实现在某种程度上依赖于类B。但它并没有指定类a的单个对象与类B的对象的关联方式——这就是关联的用途。至少我是这样理解的。:)@科斯:如果你受伤了