2014-01-09 2 views
5

Definitions taken from hereРазница между зависимостью и композицией?

Dependency

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

Состав

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

Конкретные примеры в Java из here и here

Зависимость от

class Employee { 
    private Address address; 

    // constructor 
    public Employee(Address newAddress) { 
     this.address = newAddress; 
    } 

    public Address getAddress() { 
    return this.address; 
    } 
    public void setAddress(Address newAddress) { 
     this.address = newAddress; 
    } 
} 

Состав

final class Car { 

    private final Engine engine; 

    Car(EngineSpecs specs) { 
    engine = new Engine(specs); 
    } 

    void move() { 
    engine.work(); 
    } 
} 
+2

Это интересно. Есть вопрос где-то? – Bathsheba

+1

Может быть, это в заголовке –

+0

Качество этих определений довольно плохое. Пример: «... зависимость между этими двумя классами» «Это не обязательно должно быть наоборот». Но «между» - это неориентированная взаимосвязь - это то же самое наоборот * по определению термина ** между ***. –

ответ

11

Разницу можно увидеть в двух конструкторов:

  • Dependency: Объект Address приходит из вне, он выделяется где-то в другом месте. Это означает, что объекты Address и Employee существуют отдельно, и только зависят от друг от друга.

  • Состав: Здесь вы видите, что новый Engine создается внутриCar. Объект Engine является частью Car. Это означает, что Car составляет , составленный из Engine.

+1

Итак, зависимость == агрегация? http://stackoverflow.com/questions/11881552/implementation-difference-between-aggregation-and-composition-in-java/12431359#12431359 –

+0

@ dani-h Нет, 'агрегация' и' композиция' описывают, как вещи строятся/structured, тогда как 'dependency' больше является свойством определенной структуры. См. Отличный ответ TheLostMind. –

5

Проще говоря:

Благодаря Marko Topolnik для этого ...

  1. Dependency происходит, когда один объект "зависит" от другого. Это может происходить с или без отношения между двумя объектами. На самом деле, один объект может даже не знать, что другой существует, но они могут быть зависимыми. Пример: проблема производителя-потребителя. Производитель не должен знать, что потребитель существует, но он должен делать wait() и notify(). Таким образом, «НЕТ», зависимость не является подмножеством ассоциации.

  2. Composition: Является типом ассоциации, в которой «дочерний» объект не может существовать без родительского класса. т. е. если дочерний объект существует, то он ДОЛЖЕН БЫТЬ В родительском объекте и нигде больше.

    EG: Автомобиль (Родитель) имеет систему впрыска топлива (ребенок). Теперь нет смысла иметь систему впрыска топлива вне автомобиля (это будет бесполезно). то есть система впрыска топлива не может существовать без автомобиля.

  3. Aggregation: Здесь дочерний объект может существовать вне родительского объекта. Автомобиль имеет водитель. Драйвер МОЖЕТ быть вне автомобиля.

+0

Итак, вы говорите, что композиция является подмножеством зависимости? –

+0

Да ... Зависимость - общий термин. Состав/агрегация/наследование приводят к зависимости. Хотя я считаю, что ассоциация - лучший термин для использования вместо зависимости. – TheLostMind

+0

Можете ли вы показать мне источник этого? Потому что два ответа я противоречил друг другу. Кроме того, они выглядят по-разному в UML, которые следует использовать, например, в диаграммах классов? –

0

Зависимость относится к использованию объекта только в пределах области действия. Другими словами, экземпляры класса существуют только внутри функций (или методов) содержащего класса и уничтожаются после выхода функций.

Пример, который вы указали для Dependency , не является a Зависимость, поскольку класс Employee содержит экземпляр адреса, это называется агрегацией. Агрегация подобна композиции, за исключением того, что объект также может существовать вне класса, который его использует. (Он может находиться за пределами класса). В вашем примере вы передаете копию адреса конструктору Employee. Но поскольку он создается вне объекта Employee, адрес может также существовать и там, где в программе.

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

Смежные вопросы