#1 楼
简单规则:A“拥有” B =组成:在没有A的系统中B没有任何意义或目的
A“使用” B =聚合:B独立存在(概念上)来自A
示例1:
公司是人的集合。公司是帐户的组成。当公司停止营业时,其帐户就不存在了,但其人员仍然存在。
示例2 :(非常简化)
文本编辑器拥有一个缓冲区(组成) )。文本编辑器使用文件(聚合)。关闭文本编辑器时,缓冲区被破坏,但文件本身未被破坏。
#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
评论
那么汽车是集合体还是零件的组成部分?
– 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