В чем разница между Композицией и Ассоциацией? - PullRequest
22 голосов
/ 09 апреля 2009

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

Ответы [ 8 ]

35 голосов
/ 09 апреля 2009

СОСТАВ

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

ОБЪЕДИНЕНИЕ

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

агрегация

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

17 голосов
/ 09 апреля 2009

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

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

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

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

11 голосов
/ 09 апреля 2009

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

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

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

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

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

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

Примеры:

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

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

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

3 голосов
/ 05 мая 2014

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

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 {}
1 голос
/ 09 апреля 2009

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

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

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

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

1 голос
/ 09 апреля 2009

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

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

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

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

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

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

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

1 голос
/ 09 апреля 2009

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

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

0 голосов
/ 09 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...