Повторное использование кода может быть достигнуто с помощью как наследования, так и композиции. Но при этом задействование композиции обеспечивает более высокий уровень инкапсуляции, чем наследование, так как изменения в 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“ (является), для этих целей используется композиция.
Агрегация (Делегирование) - это взаимосвязь, при которой один класс вписывается в коллекцию. Это часть целого отношения, где часть может существовать без целого. Такие отношения гораздо слабее. Нет циклической зависимости. Например: заказ и продукт.
- Один объект получает ссылку (указатель) на другой объект в процессе конструирования.
Композиция - это взаимосвязь, при которой один класс вписывается в коллекцию. Это часть целого отношения, при которой часть не может существовать без целого. Если целое уничтожается, все его составляющие тоже будут уничтожены. Это более сильные отношения. Например: многоугольник и его вершины, заказ и его компонент.
- Один объект создает другой объект и время жизни "части" зависит от времени жизни целого.