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

#1 楼

简单规则:


A“拥有” B =组成:在没有A的系统中B没有任何意义或目的
A“使用” B =聚合:B独立存在(概念上)来自A

示例1:

公司是人的集合。公司是帐户的组成。当公司停止营业时,其帐户就不存在了,但其人员仍然存在。

示例2 :(非常简化)

文本编辑器拥有一个缓冲区(组成) )。文本编辑器使用文件(聚合)。关闭文本编辑器时,缓冲区被破坏,但文件本身未被破坏。

评论


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

– reinierpost
2011年3月31日12:13

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

– reinierpost
2011年3月31日12:14

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

–柯蒂斯·巴特(Curtis Batt)
2011年3月31日14:06



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

–切斯诺科夫·尤里(Chesnokov Yuriy)
13-10-26在10:04

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

–arjun
2015年6月16日在2:13

#2 楼

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


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


所以-尽管您拥有与拥有者组成的所有权关系当所有者为所有者时,对象也会被销毁-聚合(以及包含的对象)可以独立存在。

-

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

@Curtis Batt在回答中提供了一个很好的定义:聚合与构成

评论


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

– Newtopian
2011年3月24日5:20



它与破坏无关! UML没有定义垃圾收集系统。

–显示名称
11 Mar 24 '11 at 10:01

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

–史蒂文·劳(Steven A. Lowe)
11 Mar 24 '11 at 14:13

我同意严重缺乏我的答案-但是WikiPedia文章也是如此...

–HorusKol
2011-3-24在22:13

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

– reinierpost
16年8月16日在12:20

#3 楼


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

示例:

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);
    } 
}


评论


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

– reinierpost
2014年3月24日14:54

#4 楼

没有单一的解释。不同的作者通过汇总来表达不同的意思。大多数人实际上并不表示任何具体含义。

评论


这是正确的答案。我已经阅读了两本书,其中一本是马丁·福勒(Martin Fowler)的UML Distilled。

– davidhaskins
2011-03-25 12:52



martinfowler.com/bliki/AggregationAndComposition.html

–杰里·安德鲁斯(Jerry Andrews)
16年7月25日在21:56

#5 楼

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

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

两者都表示对象之间的关系,只是强度不同。


UML表示两个类之间的依赖关系不同的类型


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

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       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 ║
╚═══════════╩═════════════════════════╩═══════════════════════╝


聚合:由于组织将Person作为雇员,因此它们之间的关系就是聚合。就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;
}




评论


这似乎没有提供任何实质性的东西,超过了先前的12个答案

– gna
15年7月1日在7:05

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

–T空白
16年1月4日在15:43

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

– Salman Muhammad Ayub
16年2月12日在9:59

关联与聚合有何不同?

– reinierpost
16年8月16日在12:22

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

– PandasRocks
18年4月1日在8:33

#6 楼

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

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

汽车聚集乘客;它们进出轮胎时不会破坏汽车的功能

轮胎是组件;卸下一个,汽车将无法正常工作

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

#7 楼

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

#8 楼

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


聚合是指那些子集独立于父集而存在的情况。由于监视器可以从计算机上拔下以连接到另一台计算机。
组成是这些子集取决于父集的存在。叶子是树的一部分,肝脏是身体的一部分。

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

#9 楼

这个简单的例子怎么样:

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

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

评论


在先前的11个答案中提出和解释的观点看来,这似乎并没有增加任何实质性内容

– gna
2014年9月5日下午16:23

敬请谅解,@ gnat。这是如何实现两者的一个有用示例。人们通过实例学习得更好。 (我来这里是为了检查我的理解,即指针成员可能是聚合,而对象成员可能是组合。这是直接解决该问题的唯一答案。)

–鲍勃·斯坦(Bob Stein)
19年4月9日在17:40