Разница между зависимостью и составом?

Определения взяты отсюда

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

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

Состав

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

Конкретные примеры на Java из здесь и здесь

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

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();
  }
}

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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