Агрегация против состава


206

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

Ответы:


322

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

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

Пример 1:

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

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

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


11
Так автомобиль - совокупность или состав его частей?
reinierpost

2
И чем агрегация отличается от любых других отношений между двумя видами сущностей?
reinierpost

55
@reinierpost В действительности , автомобиль - это совокупность частей, а части - это просто совокупность молекул ... Однако в модели все зависит от ваших требований. Важно ли рассматривать двигатель как отдельный объект, чтобы вы могли отслеживать его срок службы независимо от автомобиля? Можете ли вы использовать точно такой же двигатель в другой машине? Если это так, то вы, вероятно, хотите агрегации. В противном случае вы захотите создать композицию, потому что вас не интересуют двигатели, которые не являются частью автомобилей, и вы не заботитесь о повторном использовании двигателей.
Кертис Батт

3
чего не хватает, так это реализации примера для полного понимания ...
Чесноков Юрий

1
Как насчет сотрудника, когда компания перестает вести бизнес? Сотрудник и люди разные сущности не так ли? Могу ли я сказать, что компания состоит из сотрудников?
Арджун

36

С http://en.wikipedia.org/wiki/Object_composition

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

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

-

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

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


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

1
это не имеет ничего общего с разрушением! UML не определяет систему сбора мусора.
Отображаемое имя

2
Я думаю, что ссылка на Википедию вызывает рефлексивные отклики, но это ужасное определение - как указал @bold, эти отношения не имеют ничего общего с GC. Это также разваливается, когда объект является компонентом двух других объектов, таких как шар в шаровом шарнире, соединяющий две протезы. Отношение Компонента о функциональной зависимости.
Стивен А. Лоу

1
Я согласен с тем, что моего ответа крайне не хватает - но так же, как и статья WikiPedia ...
HorusKol

Разница между составом и агрегацией очевидна. Проблема с агрегацией заключается в том, что неясно, чем она отличается от обычной ассоциации.
reinierpost

20

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


4
Это правильный ответ. Я прочитал это в двух книгах, одна из которых - UML Distilled Мартина Фаулера .
Дэвидхаскинс


17
  • Композиция является Ассоциацией

  • Агрегация является Ассоциацией

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

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

Пример:

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

2
В чем разница между агрегацией и ассоциацией, которая не является ни составом, ни агрегацией?
reinierpost

11

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

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

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

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

UML нотации для различного рода зависимости между двумя классами введите описание изображения здесь

Композиция : Поскольку Двигатель является частью Автомобиля, отношения между ними - Композиция. Вот как они реализованы между классами 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;   
}

Источник


кажется, это не дает ничего существенного по сравнению с замечаниями, сделанными и объясненными в предыдущих 12 ответах
комнат

Уверен, книги могут существовать без библиотек. Плохой пример!
Бланк

Здесь Список сотрудников является частью Объекта Организации. Как это может быть агрегация?
Салман Мухаммед Аюб

Чем ассоциация отличается от агрегации?
reinierpost

Мне нравится этот ответ. Это наконец объяснило мне должным образом, в чем разница между агрегацией и составом.
PandasRocks

6

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

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

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

шины являются компонентами; удалить один и автомобиль больше не работает правильно

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


1

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


0

Семантически все наборы сделаны из подмножеств, верно? Следовательно:

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

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

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


-1

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

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

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


3
это, кажется, не добавляет ничего существенного к пунктам, изложенным и объясненным в предыдущих 11 ответах
комнат

С уважением не согласен, @gnat. Это полезный пример того, как они могут быть реализованы. Люди учатся лучше на примерах. (Я пришел сюда, чтобы проверить моё понимание того, что член-указатель, скорее всего, является агрегатом, а член-объект - композицией. Это единственный ответ, чтобы напрямую обратиться к этому.)
Боб Стейн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.