Агрегация против композиции
Я понимаю, какая композиция в ООП, но я не могу понять, что такое Агрегация. Может кто-нибудь объяснить?
9 ответов
Простые правила:
- A "принадлежит" B = Состав: B не имеет смысла или цели в системе без A
- A "использует" B = Агрегация: B существует независимо (концептуально) из A
Пример 1:
Компания - это совокупность людей. Компания является составом Счетов. Когда Компания перестает вести дела, ее счета перестают существовать, но ее Люди продолжают существовать.
Пример 2: (очень упрощенный)
Текстовый редактор владеет буфером (композицией). Текстовый редактор использует файл (агрегация). Когда текстовый редактор закрыт, буфер уничтожается, но сам файл не уничтожается.
Из http://en.wikipedia.org/wiki/Object_composition
Агрегация отличается от обычной композиции тем, что она не подразумевает права собственности. В композиции, когда объект-владелец уничтожается, также находятся объекты, содержащиеся в нем. В агрегации это не обязательно так. Например, университет владеет различными отделами (например, химией), и в каждом отделе есть несколько профессоров. Если университет закрывается, отделов больше не будет, но профессора в этих отделах будут продолжать существовать. Поэтому университет можно рассматривать как состав отделов, тогда как отделы имеют совокупность профессоров. Кроме того, профессор мог работать в более чем одном отделе, но отдел не мог быть частью более чем одного университета.
Итак, если у вас есть отношения собственности с композицией, принадлежащий ему объект также уничтожается, когда владелец - агрегация (и содержащиеся в ней объекты) может существовать независимо.
-
Обновление: Извинения - этот ответ слишком упрощен в ретроспективе.
c.batt дает отличное определение в своем ответе: Агрегация против композиции
Нет единого объяснения. Различные авторы означают разные вещи путем агрегирования. Большинство на самом деле не означает ничего конкретного.
-
Состав - это ассоциация
-
Агрегация - это ассоциация
-
Состав - это 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 (содержится);
}
}
Состав (смесь) - способ объединить простые объекты или типы данных в более сложные. Композиции являются критическим строительным блоком многих базовых структур данных.
Агрегация (коллекция) отличается от обычной композиции тем, что она не подразумевает права собственности. В композиции, когда объект-владелец уничтожается, также находятся объекты, содержащиеся в нем. В агрегации это не обязательно верно
â • "â • â • â • â • â • â • â • â • â • â • â • â • |â • â • â • â • â • â • â • â • â • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
â • 'â •' Агрегация â • 'Композиция â •'
â • â • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
â • «Время жизни» • «У вас есть собственное время жизни» • «Время жизни владельца» • «
â • 'Отношение â •' Имеет â • 'часть-â •'
• «Пример» • «Автомобиль имеет драйвер â • • Двигатель является частью автомобиля â • '
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • â • â • â • â • â • â • â • â • â • â • â • â • â • â •
Оба означают взаимосвязь между объектом и отличаются только своей силой.
Обозначения UML для различной зависимости между двумя классами
Состав . Поскольку движок является частью автомобиля, отношения между ними - это композиция. Вот как они реализуются между классами Java.
public class Car {
//final будет гарантировать инициализацию движка
закрытый двигатель двигателя;
public Car () {
двигатель = новый Двигатель ();
}
}
класс Engine {
private String type;
}
Агрегация . Поскольку организация имеет Person как сотрудников, отношения между ними - Aggregation. Вот как они выглядят в терминах классов Java
public class Organization {
личный список сотрудников;
}
public class Person {
private String name;
}
агрегация представляет собой простую коллекцию, такую как мешок с мрамором
композиция подразумевает внутренние /функциональные зависимости, такие как шарниры на ящике
автомобили совокупных пассажиров; они входят и выходят, не нарушая функциональность автомобиля
шины - это компоненты; удалить один, и автомобиль больше не работает правильно
[примечание: запасное колесо является агрегатом!]
Я всегда смотрю на композицию как «нужен», т. е. автомобиль нуждается в движке , и я рассматриваю агрегацию как «вещи, связанные с целями». Поэтому, сохраняя аналогию с автомобилем, мое агрегирование может представлять собой путешествие, которое может включать в себя совместное использование автомобиля и пассажиров. Путешествие не является владельцем автомобиля или пассажиров, я агрегирую данные, связанные с конкретным сценарием. Когда поездка завершена, автомобиль и пассажиры продолжаются. Когда автомобиль заканчивается, автомобиль и его двигатель обычно разрушаются вместе.
Семантически все наборы состоят из подмножеств, верно? Поэтому:
-
Агрегация - это когда эти подмножества существуют независимо от набора отцов. Поскольку монитор может быть отсоединен от компьютера для подключения к другому.
-
Композиция - это когда эти подмножества зависят от существования набора отцов. Поскольку лист является частью дерева или печени, является частью тела.
Эти понятия говорят о зависимости между двумя объектами или классами, концептуально. Непосредственно в программе, в агрегировании, когда объект отца находится, объекты совокупности также должны быть утилизированы. В том же сценарии для композиции составные сырые объекты будут сохраняться, а объект отца не распределяется.
Как насчет этого простого примера:
Массив объектов - это композиция. Массив указателей на объекты - это агрегация.
Если я удалю первый, его содержимое исчезнет с ним. Второй, с другой стороны, может исчезнуть без влияния на существование его членов, если только не существует конкретного метода, который удаляет каждый объект по мере удаления его указателя.