Различение между делегированием, композицией и агрегацией (Java OO Design)



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

Я консультировался с Java Oo Analysis and Design book, но моя путаница все еще остается. Основное объяснение заключается в следующем:

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

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

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

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

322   4  

4 ответов:

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

  1. состав: содержит одну или несколько комнат. Продолжительность жизни комнаты проконтролирована домом по мере того как комната не будет существовать без дома.

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

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

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

myRoom.doWork();

myBlock.doWork();

myMinion.doWork();

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

для компонента, комнаты приходят в существование, когда дом создается. Поэтому мы могли бы создать их в конструкторе дома.

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

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

и это вполне вероятно, что объект aTyre пришел с завода - мы не new это в любом из способов автомобиля.

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

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

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

делегация

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

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

для клиентов A вызов methodA, класс Aпредставители вызов B ' s methodB.

обоснование. класс 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 разрушен.

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

агрегация

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 будет уничтожено.

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

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

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

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

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

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


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
}

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

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

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

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

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

извините за мой английский, надеюсь, это поможет

1) делегирование: человек-водитель-пример автомобиля. Мужчина купил машину. Но этот человек не умеет водить машину. Поэтому он назначит водителя, который знает, как управлять автомобилем. Таким образом, класс Man хочет выполнить перевозку с использованием автомобиля. Но у него нет взаимодействующей функциональности / совместимости с автомобилем. Поэтому он использует класс, который имеет совместимость с автомобилем, который является драйвером, который совместим с классом man. Предполагая, что водитель может понять, что говорит человек

2) Состав: Автомобиль моделирование является обычным примером. Чтобы заставить автомобиль двигаться, колесо вращается. Класс автомобиля используя класс колеса вращает functinality как часть своей функции движения, где как колесо часть автомобиля.

3) агрегация: автомобиль и его цвет. Объект класса автомобиля ferrari будет иметь цвет объекта класса красный. Но объект класса цвета red может быть там как отдельный класс, когда поиск пользователя происходит со спецификацией красного цвета.

    Ничего не найдено.

Добавить ответ:
Отменить.