Агрегация против композиции

Я понимаю, какая композиция в ООП, но я не могу понять, что такое Агрегация. Может кто-нибудь объяснить?

187 голосов | спросил Vinoth Kumar C M 24 MaramThu, 24 Mar 2011 07:25:06 +03002011-03-24T07:25:06+03:0007 2011, 07:25:06

9 ответов


282

Простые правила:

  1. A "принадлежит" B = Состав: B не имеет смысла или цели в системе без A
  2. A "использует" B = Агрегация: B существует независимо (концептуально) из A

Пример 1:

Компания - это совокупность людей. Компания является составом Счетов. Когда Компания перестает вести дела, ее счета перестают существовать, но ее Люди продолжают существовать.

Пример 2: (очень упрощенный)

Текстовый редактор владеет буфером (композицией). Текстовый редактор использует файл (агрегация). Когда текстовый редактор закрыт, буфер уничтожается, но сам файл не уничтожается.

ответил Curtis Batt 24 MarpmThu, 24 Mar 2011 17:57:09 +03002011-03-24T17:57:09+03:0005 2011, 17:57:09
35

Из http://en.wikipedia.org/wiki/Object_composition

  

Агрегация отличается от обычной композиции тем, что она не подразумевает права собственности. В композиции, когда объект-владелец уничтожается, также находятся объекты, содержащиеся в нем. В агрегации это не обязательно так. Например, университет владеет различными отделами (например, химией), и в каждом отделе есть несколько профессоров. Если университет закрывается, отделов больше не будет, но профессора в этих отделах будут продолжать существовать. Поэтому университет можно рассматривать как состав отделов, тогда как отделы имеют совокупность профессоров. Кроме того, профессор мог работать в более чем одном отделе, но отдел не мог быть частью более чем одного университета.

Итак, если у вас есть отношения собственности с композицией, принадлежащий ему объект также уничтожается, когда владелец - агрегация (и содержащиеся в ней объекты) может существовать независимо.

-

Обновление: Извинения - этот ответ слишком упрощен в ретроспективе.

c.batt дает отличное определение в своем ответе: Агрегация против композиции

ответил Curtis Batt 24 MarpmThu, 24 Mar 2011 17:57:09 +03002011-03-24T17:57:09+03:0005 2011, 17:57:09
19

Нет единого объяснения. Различные авторы означают разные вещи путем агрегирования. Большинство на самом деле не означает ничего конкретного.

ответил reinierpost 24 MarpmThu, 24 Mar 2011 12:58:33 +03002011-03-24T12:58:33+03:0012 2011, 12:58:33
15
  • Состав - это ассоциация

  • Агрегация - это ассоциация

  • Состав - это strong Ассоциация (если жизнь содержащегося объекта полностью зависит от объекта-контейнера, она называется сильной ассоциацией)

  • Агрегация - это ассоциация слабый (если жизнь содержащегося объекта не зависит от объекта-контейнера, она называется слабой ассоциацией)

Пример:

class Содержится {
    public void disp () {
        System.out.println ("disp () Содержимого A");
    }
}

открытый класс Container {
    частный Содержится c;

    //Состав
    Контейнер () {
        c = новый Contained ();
    }

    //Ассоциация
    public Содержится getC () {
        return c;
    }

    public void setC (Содержится c) {
        this.c = c;
    }

    public static void main (String [] args) {
        Контейнер контейнера = новый контейнер ();
        Содержится содержащийся = new Contained ();
        container.setC (содержится);
    }
}
ответил Pawan 9 J000000Tuesday13 2013, 11:24:59
11

Состав (смесь) - способ объединить простые объекты или типы данных в более сложные. Композиции являются критическим строительным блоком многих базовых структур данных.

Агрегация (коллекция) отличается от обычной композиции тем, что она не подразумевает права собственности. В композиции, когда объект-владелец уничтожается, также находятся объекты, содержащиеся в нем. В агрегации это не обязательно верно

â • "â • â • â • â • â • â • â • â • â • â • â • â • |â • â • â • â • â • â • â • â • â • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
â • 'â •' Агрегация â • 'Композиция â •'
â • â • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
â • «Время жизни» • «У вас есть собственное время жизни» • «Время жизни владельца» • «
â • 'Отношение â •' Имеет â • 'часть-â •'
• «Пример» • «Автомобиль имеет драйвер â • • Двигатель является частью автомобиля â • '
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • â • â • â • â • â • â • â • â • â • â • â • â • â • â •

Оба означают взаимосвязь между объектом и отличаются только своей силой. «введите

Обозначения UML для различной зависимости между двумя классами «введите

Состав . Поскольку движок является частью автомобиля, отношения между ними - это композиция. Вот как они реализуются между классами Java.

public class Car {
    //final будет гарантировать инициализацию движка
    закрытый двигатель двигателя;

    public Car () {
       двигатель = новый Двигатель ();
    }
}

класс Engine {
    private String type;
}

Агрегация . Поскольку организация имеет Person как сотрудников, отношения между ними - Aggregation. Вот как они выглядят в терминах классов Java

public class Organization {
    личный список сотрудников;
}


public class Person {
    private String name;
}

Источник

ответил Premraj 1 J000000Wednesday15 2015, 08:28:09
6

агрегация представляет собой простую коллекцию, такую ​​как мешок с мрамором

композиция подразумевает внутренние /функциональные зависимости, такие как шарниры на ящике

автомобили совокупных пассажиров; они входят и выходят, не нарушая функциональность автомобиля

шины - это компоненты; удалить один, и автомобиль больше не работает правильно

[примечание: запасное колесо является агрегатом!]

ответил Steven A. Lowe 24 MarpmThu, 24 Mar 2011 17:09:20 +03002011-03-24T17:09:20+03:0005 2011, 17:09:20
1

Я всегда смотрю на композицию как «нужен», т. е. автомобиль нуждается в движке , и я рассматриваю агрегацию как «вещи, связанные с целями». Поэтому, сохраняя аналогию с автомобилем, мое агрегирование может представлять собой путешествие, которое может включать в себя совместное использование автомобиля и пассажиров. Путешествие не является владельцем автомобиля или пассажиров, я агрегирую данные, связанные с конкретным сценарием. Когда поездка завершена, автомобиль и пассажиры продолжаются. Когда автомобиль заканчивается, автомобиль и его двигатель обычно разрушаются вместе.

ответил Lazarus 24 MarpmThu, 24 Mar 2011 12:52:52 +03002011-03-24T12:52:52+03:0012 2011, 12:52:52
0

Семантически все наборы состоят из подмножеств, верно? Поэтому:

  • Агрегация - это когда эти подмножества существуют независимо от набора отцов. Поскольку монитор может быть отсоединен от компьютера для подключения к другому.

  • Композиция - это когда эти подмножества зависят от существования набора отцов. Поскольку лист является частью дерева или печени, является частью тела.

Эти понятия говорят о зависимости между двумя объектами или классами, концептуально. Непосредственно в программе, в агрегировании, когда объект отца находится, объекты совокупности также должны быть утилизированы. В том же сценарии для композиции составные сырые объекты будут сохраняться, а объект отца не распределяется.

ответил Negarrak 8 PM000000100000000931 2014, 22:55:09
-2

Как насчет этого простого примера:

Массив объектов - это композиция. Массив указателей на объекты - это агрегация.

Если я удалю первый, его содержимое исчезнет с ним. Второй, с другой стороны, может исчезнуть без влияния на существование его членов, если только не существует конкретного метода, который удаляет каждый объект по мере удаления его указателя.

ответил user2831074 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 05 Sep 2014 18:03:10 +0400 2014, 18:03:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132