Skip to content

Latest commit

 

History

History
44 lines (31 loc) · 5.23 KB

Composition.md

File metadata and controls

44 lines (31 loc) · 5.23 KB

Композиция

Повторное использование кода может быть достигнуто с помощью как наследования, так и композиции. Но при этом задействование композиции обеспечивает более высокий уровень инкапсуляции, чем наследование, так как изменения в back-end классе не обязательно затронут код, который относится к front-end классу.

Композиция - это техника проектирования, применяющая в классах отношения типа «has a» (имеет, включает в себя). Для повторного использования кода могут применяться как наследование в java, так и композиция объекта.


Суть композиции

Заключается в выражении отношения «has a» между объектами. Подумайте о стуле. У стула есть (has a) сидение. У стула есть (has a) спинка. У стула есть (has a) определенное количество ножек. Фраза "has a" / "есть" предполагает отношения, в которых стул имеет или, как минимум, использует другой объект. Это как раз и есть отношения "has a", являющиеся основой композиции.

Преимущества

  • Контроль видимости;
  • Реализация может быть заменена во время выполнения (run-time);
  • Слабая связанность*, так как класс-интерфейс не зависит от реализации.

Различия между композицией и наследованием

Композиция (has a / имеет) Наследование (is a / является)
Поддерживает полиморфизм и повторное использование кода. Поддерживает полиморфизм и повторное использование кода.
Объект во время выполнения (run-time) уже создан. Объект создается динамически во время компиляции.
Реализация может быть заменена во время выполнения (run-time). Реализация может быть заменена во время компиляции.
Подкласс не зависит от класса-родителя, что благоприятствует слабому связыванию (особенно под управлением интерфейса). Подкласс зависит от реализации класса-родителя, поэтому связывание считается сильным.
В Доме есть Ванная комната. Неправильно говорить, что Дом - это Ванная комната. Наследование является однонаправленным: Дом - это Здание. Но здание не является домом.

!!! Не используйте наследование только для того, чтобы обеспечить повторное использование кода. Если нет отношений “is a“ (является), для этих целей используется композиция.

Разница между композицией и агрегацией в отношениях объектов.

Агрегация (Делегирование) - это взаимосвязь, при которой один класс вписывается в коллекцию. Это часть целого отношения, где часть может существовать без целого. Такие отношения гораздо слабее. Нет циклической зависимости. Например: заказ и продукт.

  • Один объект получает ссылку (указатель) на другой объект в процессе конструирования.

Композиция - это взаимосвязь, при которой один класс вписывается в коллекцию. Это часть целого отношения, при которой часть не может существовать без целого. Если целое уничтожается, все его составляющие тоже будут уничтожены. Это более сильные отношения. Например: многоугольник и его вершины, заказ и его компонент.

  • Один объект создает другой объект и время жизни "части" зависит от времени жизни целого.