it-swarm.cn

聚合与构成

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

220
Vinoth Kumar C M

简单规则:

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

范例1:

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

示例2 :(非常简化)

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

333
Curtis Batt

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

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

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

-

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

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

38
HorusKol

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

20
reinierpost
  • 作文是一个协会

  • 聚合是一个协会

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

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

例:

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

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

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

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

两者都表示物体之间的关系,只是强度不同。 enter image description here

两个类之间不同类型的依赖关系的UML表示法 enter image description here

Composition:由于Engine是Car的一部分,因此它们之间的关系是Composition。这是它们在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;
}

Aggregation:由于组织具有Person作为雇员,因此它们之间的关系是Aggregation。这是它们在Java类

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

来源

13
Premraj

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

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

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

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

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

7
Steven A. Lowe

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

2
Lazarus

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

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

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

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

0
Negarrak

这个简单的例子怎么样:

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

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

0
user2831074