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

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

8 ответов

СОСТАВ

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

АССОЦИАЦИЯ

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

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

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

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

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

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

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

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

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

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

ОП комментарии:

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

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

Примеры:

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

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

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

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

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 {}

Самостоятельное существование.

Счет состоит из позиций.

Какая позиция не включена в счет? Это... ну, ничего. Это не может существовать независимо.

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

Клиент имеет независимое существование, с или без счета.

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам