我了解OOP中的组合是什么,但是我无法清楚地知道什么是聚合。有人可以解释吗?
我了解OOP中的组合是什么,但是我无法清楚地知道什么是聚合。有人可以解释吗?
Answers:
简单规则:
范例1:
公司是人的集合。公司是帐户的组成。当公司停止营业时,其帐户将不复存在,但其人员仍将继续存在。
示例2 :(非常简化)
文本编辑器拥有一个缓冲区(组成)。文本编辑器使用文件(聚合)。关闭文本编辑器后,缓冲区将被销毁,但文件本身不会被销毁。
来自http://en.wikipedia.org/wiki/Object_composition
汇总与普通的汇总不同,因为汇总并不暗示所有权。在合成中,当拥有对象被破坏时,所包含的对象也会被破坏。总体而言,这不一定是正确的。例如,一所大学拥有多个系(例如化学系),每个系都有许多教授。如果大学关闭,这些系将不再存在,但这些系中的教授将继续存在。因此,大学可以看作是系的组成,而系则是教授的集合体。此外,一位教授可以在一个以上的系中工作,但是一个系不能属于一个以上的大学。
因此-当您与组成具有所有权关系时,如果所有者是所有者,则拥有的对象也会被破坏-聚合(和包含的对象)可以独立存在。
-
更新:道歉-事后看来,这个答案太简单了。
c.batt在他的答案中提供了一个很好的定义:聚合与构成
没有单一的解释。不同的作者通过汇总来表达不同的意思。大多数人实际上并不表示任何具体含义。
作文是一个协会
聚合是一个协会
组合是强关联(如果包含对象的寿命完全取决于容器对象,则称为强关联)
聚合是一个弱关联(如果包含的对象的寿命不依赖于容器对象,则称为弱关联)
例:
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);
}
}
组合(混合)是一种将简单对象或数据类型组合为更复杂对象的方法。合成是许多基本数据结构的关键构建块
聚集(集合)与普通组成不同,因为它并不暗示所有权。在合成中,当拥有对象被破坏时,所包含的对象也会被破坏。总体而言,这不一定是正确的
╔═══════════╦═════════════════════════╦═══════════════════════╗
║ ║ 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 ║
╚═══════════╩═════════════════════════╩═══════════════════════╝
组成:由于引擎是汽车的一部分,因此它们之间的关系是组成。这是在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;
}