聚合与构成


205

我了解OOP中的组合是什么,但是我无法清楚地知道什么是聚合。有人可以解释吗?

Answers:


321

简单规则:

  1. A“拥有者” B =成分:在没有A的系统中B没有意义或目的
  2. A“使用” B =聚合:B与A独立(概念上)存在

范例1:

公司是人的集合。公司是帐户的组成。当公司停止营业时,其帐户将不复存在,但其人员仍将继续存在。

示例2 :(非常简化)

文本编辑器拥有一个缓冲区(组成)。文本编辑器使用文件(聚合)。关闭文本编辑器后,缓冲区将被销毁,但文件本身不会被销毁。


11
那么汽车是集合体还是零件的组成部分?
reinierpost 2011年

2
聚合与两种实体之间的任何其他关系有何不同?
reinierpost 2011年

55
@reinierpost 实际上,汽车是零件的聚集,而零件只是分子的聚集...但是,在模型中,这全都取决于您的要求。将发动机视为一个单独的实体是否重要,以便您可以独立于汽车来跟踪其寿命?您可以在另一辆汽车中重复使用完全相同的发动机吗?如果是这样,那么您可能想要聚合。否则,您需要合成,因为您不关心不属于汽车的引擎,也不关心重复使用引擎。
柯蒂斯·巴特

3
所缺少的是一个完全理解的实现示例...
Chesnokov Yuriy

1
当公司停止营业时,员工呢?员工和人是不同的实体吧?那么我可以说公司是员工的组成部分吗?
阿琼

36

来自http://en.wikipedia.org/wiki/Object_composition

汇总与普通的汇总不同,因为汇总并不暗示所有权。在合成中,当拥有对象被破坏时,所包含的对象也会被破坏。总体而言,这不一定是正确的。例如,一所大学拥有多个系(例如化学系),每个系都有许多教授。如果大学关闭,这些系将不再存在,但这些系中的教授将继续存在。因此,大学可以看作是系的组成,而系则是教授的集合体。此外,一位教授可以在一个以上的系中工作,但是一个系不能属于一个以上的大学。

因此-当您与组成具有所有权关系时,如果所有者是所有者,则拥有的对象也会被破坏-聚合(和包含的对象)可以独立存在。

-

更新:道歉-事后看来,这个答案太简单了。

c.batt在他的答案中提供了一个很好的定义:聚合与构成


3
在示例中,您引用的组合是一对多的,并且聚合也隐含了一对多的关系,尽管在这里聚合也可能是多对多的关系(我们可以假设一位老师可以在多个部门任教)。鉴于一个系不能属于多所大学。组成意味着所有权,而聚集并不超出关系。引用正确,但评论不正确。
Newtopian 2011年

1
它与破坏无关!UML没有定义垃圾收集系统。
显示名称

2
我认为Wikipedia链接正在获得反思,但这是一个糟糕的定义-正如@bold指出的,这些关系与GC无关。当一个对象是其他两个对象的组成部分(例如,连接两个人造肢体的球窝中的球)时,这也将崩溃。组件关系与功能依赖性有关。
Steven A. Lowe

1
我同意严重缺乏答案-WikiPedia文章也是如此……
HorusKol 2011年

组成和聚集之间的区别很明显。聚合的问题在于,目前尚不清楚它与普通关联有何不同。
reinierpost


16
  • 作文是一个协会

  • 聚合是一个协会

  • 组合是关联(如果包含对象的寿命完全取决于容器对象,则称为强关联)

  • 聚合是一个关联(如果包含的对象的寿命不依赖于容器对象,则称为弱关联)

例:

class Contained {
    public void disp() {
        System.out.println("disp() of Contained A");
    }
}

public class Container {
    private Contained c;

    //Composition
    Container() {
        c = new Contained(); 
    }

    //Association 
    public Contained getC() {
        return c;
    }

    public void setC(Contained c) {
        this.c = c;
    }     

    public static void main(String[] args) {
        Container container = new Container();
        Contained contained = new Contained();
        container.setC(contained);
    } 
}

2
既不是组合也不是聚合的聚合和关联之间的区别是什么?
reinierpost 2014年

11

组合(混合)是一种将简单对象或数据类型组合为更复杂对象的方法。合成是许多基本数据结构的关键构建块

聚集(集合)与普通组成不同,因为它并不暗示所有权。在合成中,当拥有对象被破坏时,所包含的对象也会被破坏。总体而言,这不一定是正确的

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       Aggregation       ║      Composition      ║
╠═══════════╬═════════════════════════╬═══════════════════════╣
║ Life time ║ Have their own lifetime ║ Owner's life time     ║
║ Relation  ║ Has                     ║ part-of               ║
║ Example   ║ Car has driver          ║ Engine is part of Car ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

两者都表示物体之间的关系,只是强度不同。 在此处输入图片说明

UML表示法用于两个类之间的不同类型的依赖关系 在此处输入图片说明

组成:由于引擎是汽车的一部分,因此它们之间的关系是组成。这是在Java类之间实现它们的方式。

public class Car {
    //final will make sure engine is initialized
    private final Engine engine;  

    public Car(){
       engine  = new Engine();
    }
}

class Engine {
    private String type;
}

聚集:由于组织具有“人”作为雇员,因此它们之间的关系就是聚集。它们是Java类的样子

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

资源


这似乎并没有提供对之前12个答案中提出和解释的要点的实质性建议
t

可以肯定,没有图书馆就可以存在书籍。不好的例子!
T Blank

这里的员工列表是组织对象的一部分。这怎么可能是聚合?
Salman Muhammad Ayub

关联与聚合有何不同?
reinierpost

我喜欢这个答案。最终,它向我正确地解释了聚合和组合之间的区别。
PandasRocks

6

聚合是一个简单的集合,就像一袋大理石

组成意味着内部/功能上的依赖性,例如盒子上的​​铰链

汽车聚集乘客;他们进出汽车而不会破坏汽车的功能

轮胎是零件;拆下一辆,汽车将无法正常工作

[注意:备用轮胎是一个骨料!]


1

我一直将组合视为“需要”,即汽车需要引擎,而将聚合视为“与目的相关的事物”。因此,与汽车类比保持一致,我的总结可能是代表一个旅程,其中可能涉及将汽车和乘客聚集在一起。旅程并不拥有汽车或乘客,我正在汇总与特定情况相关的数据。旅程完成后,汽车和乘客继续前进。汽车停驶后,通常会将汽车及其引擎一起销毁。


0

从语义上讲,所有集合都是由子集组成的,对吗?因此:

  • 聚合是指那些子集独立于父集而存在的时间。由于监视器可以从计算机上拔下以连接到另一台计算机。

  • 组成是那些子集取决于父集的存在时。叶子是树的一部分,肝脏是身体的一部分。

这些概念从概念上讨论了两个对象或类之间的依赖关系。直接在程序中,在聚合中,当父对象配置时,聚合对象也应配置。在合成的相同场景中,复合子对象将保留下来,然后父对象将分配。


-1

这个简单的例子怎么样:

对象数组是一个组合。指向对象的指针数组是一个聚合。

如果删除第一个,则其内容将消失。另一方面,第二个方法可以消失而不影响其成员的存在,除非有一种特定的方法可以在删除其指针时删除每个对象。


3
这似乎并没有增加任何实质性过点进行,而且在以往11个回答解释
蚊蚋

尊敬的不同意,@ gnat。这是如何实现两者的一个有用示例。人们通过实例学习得更好。(我来这里是为了检查我的理解,即指针成员可能是聚合,而对象成员可能是合成。这是直接解决这个问题的唯一答案。)
Bob Stein
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.