В чем разница между композицией и ассоциацией?

В ООП существует разница между композицией (обозначенной заполненным алмазом в UML) и связью (обозначенной пустым алмазом в UML) между классами. Я немного смущен. Что такое агрегация? Могу ли я иметь убедительный пример в реальном мире?

Ответ 1

Состав

Представьте себе фирму программного обеспечения, состоящую из разных подразделений (или подразделений), таких как Storage BU, Networking BU. Автомобильная БУ. Срок службы этих бизнес-единиц зависит от продолжительности жизни организации. Другими словами, эти Бизнес-единицы не могут существовать независимо от фирмы. Это СОСТАВ. (т.е. фирма СОЗДАНА из бизнес-единиц)

ОБЪЕДИНЕНИЕ

У фирмы-производителя программного обеспечения могут быть внешние службы общественного питания, служащие продуктам питания для сотрудников. Эти поставщики общественного питания НЕ ЧАСТЬ фирмы. Тем не менее, они присоединяются к фирме. Провайдеры могут существовать, даже если наша программная фирма закрыта. Они могут служить другой фирме! Таким образом, срок службы провизии не зависит от срока службы фирмы-производителя программного обеспечения. Это типичная АССОЦИАЦИЯ

АГРЕГИРОВАНИЕ

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

Ответ 2

Вот несколько примеров:

  • Я сотрудник компании, поэтому я связан с этой компанией. Я не являюсь частью этого, и я не сочиняю его, но я связан с ним, однако.

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

  • Существует еще один менее ограниченный состав, называемый агрегацией. Агрегация - это когда объекты создаются другими объектами, но их жизненные циклы не обязательно связаны. Используя крайний пример, игрушка Lego представляет собой совокупность деталей. Несмотря на то, что игрушка может быть демонтирована, ее части могут быть рекомбинированы для создания другой игрушки.

Ответ 3

Владение и использование.

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

Ассоциация: объект с ссылкой использует упомянутый объект, не может быть эксклюзивным пользователем и не несет ответственности за то, что он ссылался на срок жизни объекта. Также известен как отношения использования-отношения.

Комментарии OP:

Можете ли вы представить пример реального мира. Кроме того, что такое агрегация? - Марк

Агрегация: ассоциация, которая от целого к части, и которая не может быть циклической.

Примеры:

Состав: автомобиль имеет-Двигатель, у человека есть адрес. В принципе, должен иметь, управляет временем жизни.

Ассоциация: у автомобиля есть драйвер, у какого-то экземпляра класса есть ErrorLogger. Срок службы, не контролируемый, может быть общим.

Агрегация: DOM (Объектная модель документа, то есть объекты, которые составляют дерево элементов HTML) Node has-a (массив) дочерних узлов. Node - верхний (ну, более высокий) уровень; он "содержит" своих детей, они не содержат его.

Ответ 4

Я считаю, что пример на основе кода может помочь проиллюстрировать понятия, приведенные в приведенных выше ответах.

import java.util.ArrayList;

public final class AssoCia
{
    public static void main( String args[] )
    {
        B b = new B();
        ArrayList<C> cs = new ArrayList();

        A a = new A( b, cs );

        a.addC( new C() );
        a.addC( new C() );
        a.addC( new C() );
        a.listC();
    }
}

class A
{
    // Association -
    // this instance has a object of other class
    // as a member of the class.
    private B b;

    // Association/Aggregation -
    // this instance has a collection of objects
    // of other class and this collection is a
    // member of this class
    private ArrayList<C> cs;

    private D d;

    public A(B b, ArrayList<C> cs)
    {
        // Association
        this.b = b;

        // Association/Aggregation
        this.cs = cs;

        // Association/Composition -
        // this instance is responsible for creating
        // the instance of the object of the
        // other class. Therefore, when this instance 
        // is liberated from the memory, the object of
        // the other class is liberated, too.
        this.d = new D();
    }

    // Dependency -
    // only this method needs the object
    // of the other class.
    public void addC( C c )
    {
        cs.add( c );
    }

    public void listC()
    {
        for ( C c : cs )
        {
            System.out.println( c );
        }
    }

}

class B {}

class C {}

class D {}

Ответ 5

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

Однако это только практика, которую я наблюдал. Мне не терпится признать это, но вспашка через спецификацию UML2 невелика в моем списке забавных вещей, которые нужно сделать!

Ответ 6

Независимое существование.

Счет-фактура состоит из позиций.

Какая позиция, не включенная в счет-фактуру? Это - хорошо - это ничего. Он не может существовать независимо.

С другой стороны, счет-фактура связан с клиентом.

Клиент имеет независимое существование с факсом или без него.

Если две вещи имеют независимое существование, они могут быть связаны.

Если одна вещь не может существовать независимо, то она является частью композиции.

Ответ 7

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

Пример реального мира: вы определяете окно графического интерфейса, а затем текстовое поле, где нужно что-то писать. Между классом, определяющим GUI, и классом, определяющим текстовое поле, будет состав. Вместе они составляют виджет, который можно рассматривать как сущность самостоятельно. Предположим, вы удалили окно, и вы также удалите текстовое поле.

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

Также, как правило, состав определяется во время создания. Агрегация вместо этого определяется позже в течение жизни объекта.

Ответ 8

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

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