Я понимаю, что такое композиция в ООП, но я не могу понять, что такое Агрегация. Может кто-нибудь объяснить?
Я понимаю, что такое композиция в ООП, но я не могу понять, что такое Агрегация. Может кто-нибудь объяснить?
Ответы:
Простые правила:
Пример 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 ║
╚═══════════╩═════════════════════════╩═══════════════════════╝
Оба обозначают отношения между объектами и отличаются только их силой.
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;
}
агрегация представляет собой простую коллекцию, как мешок мрамора
композиция подразумевает внутренние / функциональные зависимости, такие как петли на коробке
автомобили объединяют пассажиров; они входят и выходят, не нарушая функциональность автомобиля
шины являются компонентами; удалить один и автомобиль больше не работает правильно
[примечание: запасное колесо - это агрегат!]
Я всегда рассматриваю композицию как «нужно», т. Е. Машине нужен двигатель, а агрегат - как «вещи, имеющие отношение к цели». Поэтому, придерживаясь аналогии с автомобилями, я могу представить, как можно объединить автомобиль и пассажиров. Путешествие не принадлежит ни машине, ни пассажирам, я собираю данные, связанные с конкретным сценарием. Когда путешествие закончено, машина и пассажиры продолжают путь. Когда автомобиль заканчивается, автомобиль и его двигатель обычно уничтожаются вместе.
Семантически все наборы сделаны из подмножеств, верно? Следовательно:
Агрегация - это когда эти подмножества существуют независимо от родительского набора. Как монитор можно отключить от компьютера для подключения к другому.
Композиция - это когда эти подмножества зависят от существования набора отца. Поскольку лист является частью дерева или печень является частью тела.
Эти понятия говорят о типе зависимости между двумя объектами или классами, концептуально. Непосредственно в программе, в агрегате, когда утилизируется родительский объект, агрегатные объекты также должны быть расположены. В том же сценарии для композиции составные объекты-сыновья сохраняются, а затем объект-родитель расходуются.
Как насчет этого простого примера:
Массив объектов представляет собой композицию. Массив указателей на объекты является агрегацией.
Если я удаляю первый, его содержимое исчезает вместе с ним. Второй, с другой стороны, может исчезать, не влияя на существование его членов, если только не существует специального метода, который удаляет каждый объект при удалении его указателя.