Различая делегацию, состав и агрегирование (Java Дизайн OO)

make -C /path/to/dir

57
задан Hussein El Feky 3 May 2018 в 09:11
поделиться

3 ответа

Ваш объект будет ссылаться на другой объект (ы) во всех трех случаях. Разница заключается в поведении и / или жизненном цикле ссылочных объектов. Некоторые примеры:

  1. Состав: Дом состоит из одной или нескольких комнат. Время жизни комнаты контролируется Домом, так как Комната не будет существовать без Дома.

  2. Агрегация: Игрушечный домик, построенный из блоков. Вы можете разобрать его, но блоки останутся.

  3. Делегация: Ваш босс попросил вас принести ему кофе, вместо этого за вас это сделал стажер. Делегирование - это не тип ассоциации (например, композиция / агрегирование). Последние два обсуждались в Stack Overflow много раз

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

myRoom.doWork();

myBlock.doWork();

myMinion.doWork();

, но различия заключаются в жизненном цикле и мощности связанных объектов.

Для Компонента Комнаты возникают при создании Дома. Так что мы можем создать их в конструкторе Дома.

В случае ассоциации (я буду использовать шины и автомобиль) Автомобили могут добавлять шины в свой конструктор, но позже вы можете удалить и заменить шины. Итак, у вас также есть такие методы, как

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

. И вполне вероятно, что объект aTyre был получен из Factory - мы не создали его ни в одном из методов Car.

В случае делегирования у вас может даже не быть переменной-члена для хранения делегата.

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

связь между объектами длится только до тех пор, пока стажер приносит кофе. Затем он возвращается в пул ресурсов.

Что касается Компонента, Комнаты возникают при создании Дома. Так что мы можем создать их в конструкторе Дома.

В случае ассоциации (я использую шины и автомобиль) автомобили могут добавлять шины в свой конструктор, но позже вы можете удалить и заменить шины. Итак, у вас также есть такие методы, как

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

. И вполне вероятно, что объект aTyre был взят из Factory - мы не создали его ни в одном из методов Car.

В случае делегирования у вас может даже не быть переменной-члена для хранения делегата.

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

связь между объектами длится только до тех пор, пока стажер приносит кофе. Затем он возвращается в пул ресурсов.

Что касается Компонента, Комнаты возникают при создании Дома. Так что мы можем создать их в конструкторе Дома.

В случае ассоциации (я буду использовать шины и автомобиль) Автомобили могут добавлять шины в свой конструктор, но позже вы можете удалить и заменить шины. Итак, у вас также есть такие методы, как

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

. И вполне вероятно, что объект aTyre был получен из Factory - мы не создали его ни в одном из методов Car.

В случае делегирования у вас может даже не быть переменной-члена для хранения делегата.

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

связь между объектами длится только до тех пор, пока стажер приносит кофе. Затем он возвращается в пул ресурсов.

В случае ассоциации (я буду использовать шины и автомобиль) Автомобили могут добавлять шины в свой конструктор, но позже вы можете удалить и заменить шины. Итак, у вас также есть такие методы, как

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

. И вполне вероятно, что объект aTyre был получен из Factory - мы не создали его ни в одном из методов Car.

В случае делегирования у вас может даже не быть переменной-члена для хранения делегата.

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

связь между объектами длится только до тех пор, пока стажер приносит кофе. Затем он возвращается в пул ресурсов.

В случае ассоциации (я использую шины и автомобиль) автомобили могут добавлять шины в свой конструктор, но позже вы можете удалить и заменить шины. Итак, у вас также есть такие методы, как

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

. И вполне вероятно, что объект aTyre был получен из Factory - мы не создали его ни в одном из методов Car.

В случае делегирования у вас может даже не быть переменной-члена для хранения делегата.

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

связь между объектами длится только до тех пор, пока стажер приносит кофе. Затем он возвращается в пул ресурсов.

t new в любом из методов Car.

В случае делегирования у вас может даже не быть переменной-члена для хранения делегата.

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

связь между объектами длится только до тех пор, пока стажер приносит кофе. Затем он возвращается в пул ресурсов.

t new в любом из методов Car.

В случае делегирования у вас может даже не быть переменной-члена для хранения делегата.

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

связь между объектами длится только до тех пор, пока стажер приносит кофе. Затем он возвращается в пул ресурсов.

52
ответ дан 24 November 2019 в 19:28
поделиться

Делегирование

public class A {
  private B b = new B();

  public void methodA() {
    b.methodB();
  }
}

Когда клиенты A вызывают methodA , класс A делегирует вызов B методB .

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

Гибридное делегирование

public class A {
  private B b = new B();

  public void methodA() {
    b.methodB( this );
  }
}

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

    b.methodB( this );

Обоснование. Позволяет экземплярам класса B использовать функции, доступные из класса A , так же, как класс B , если бы он унаследован от класса A - но без наследства. Дальнейшее изучение .

Состав

public class A {
  private B b = new B();

  public A() {
  }
}

Когда больше не существует ссылок на конкретный экземпляр класса A , его экземпляр класса B уничтожается. 1257] Обоснование. Позволяет классам определять поведение и атрибуты модульным способом. Дальнейшее изучение .

Агрегация

public class A {
  private B b;

  public A( B b ) {
    this.b = b;
  }
}

public class C {
  private B b = new B();

  public C() {
    A a = new A( this.b );
  }
}

Когда больше нет ссылок на конкретный экземпляр класса A , его экземпляр класса B не будет уничтожен. В этом примере оба A и C должны быть удалены, прежде чем B будет уничтожен.

Обоснование. Позволяет экземплярам повторно использовать объекты. Дальнейшее изучение .

Демонстрация без ссылок

Имена, данные этим простым шаблонам, определяются их ссылочными отношениями.

58
ответ дан 24 November 2019 в 19:28
поделиться

Ваша книга объясняет довольно хорошо, поэтому позвольте мне уточнить и предоставить вам несколько примеров.

делегирование: Когда мой объект использует функциональность другого объекта как есть, не изменяя ее.

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


class FeatureHolder {
 void feature() {
  // Big implementation of the feature that you dont want to put in the class Big
 }
}

class Big {
 private FeatureHolder FH = new FeatureHolder();

 void feature() {
  // Delegate to FeatureHolder.
  FH.feature();
 }

 //.. Other features
}

Из приведенного выше примера Big.feature () вызывает функцию FH как есть, не изменяя ее. Таким образом, класс Big не обязательно должен содержать реализацию функции (разделение труда). Кроме того, feature () может реализовываться по-разному другим классом, таким как «NewFeatureHolder», и Big может вместо этого использовать новый держатель функции.

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

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

Технически композиция является «частью», а агрегация - «ссылкой». Ваши руки - это часть вас. Если вы больше не живете, ваша рука тоже умрет. Ваша ткань не является частью вас, но она у вас есть; как вы можете гость, ваша ткань не идет с вами.

В программировании некоторые объекты являются частью другого объекта, и они не имеют логического значения без него. Например, кнопка входит в рамку окна. Если рамка закрыта, кнопка больше не имеет смысла (композиция). Кнопка может иметь ссылку на базу данных (например, обновлять данные); когда кнопка устранена,

17
ответ дан 24 November 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: