Association, Aggregation and Composition #
В ООП(не только в Java) помимо наследования различают ещё три связи между объектами:
- Ассоциация
- Агрегация
- Композиция
- Наследование
Агрегация - Aggregation #
Мы говорим об агрегации, когда объект может быть частью нескольких составных объектов(компонентов). В этом случае полученный объект агрегирован. Срок службы деталей может быть больше, чем срок службы агрегата.
Примером агрегации являются взаимоотношения между футбольной командой и ее игроками. Человек может играть в нескольких командах, и если команда распущена, обычно это не означает конец для ее бывших игроков. Футбольная команда - Aggregate.
Композиция - Composition #
В композиции деталь может содержаться только в одном композитном объекте, а срок службы композитного объекта всегда соответствует сроку службы его компонентов. Здесь составной объект называется композитным.
Примером композиции является связь между заказом на покупку и отдельными позициями заказа на покупку. Если заказ на покупку удаляется, то автоматически удаляются и все его элементы. Дом и квартира в нём. Если дом разрушить, то и квартира не может пережить разрушение дома.
Ассоциация - Association #
Отношение между классами, которые не влияют друг на друга и не являются “родственниками” называют ассоциация. Иногда слово ассоциация используют как синоним слову отношения. На мой взгляд это немного запутывает. Но Java не единственный язык OOP и реализаций отношений между объектами возможно много больше, чем определений. Потому я не претендую на последнюю инстанцию. Но в своей статье использую “Association” для “простых связей” между объектами.
Пример ассоциации. Человек(Водитель) и легковая машина. Водитель может управлять машиной. Но каждый из них живёт своей собственной жизнью и не является частью другого.
Ни в какие рамки #
Студент и университет. Какая здесь связь?
По идее не композиция. Студенты точно не являются частью университета. Это и не наследование. Простая ассоциация или агрегация? Может это такой же случай как и футбольная команда. Может универ существовать без студентов или нет? Мы понимаем, что универ наверное немного сложнее, чем футбол, и в нём есть кафедры, специальности, потоки, курсы, группы. И вот группа скорее всего агрегация. Сама группа часть кафедры, а кафедры уже часть универа.
Порой надо понимать реализацию или упрощать связь до возможного описания в коде. Но в жизни всё может быть немного сложнее, чем в книге.
Я сделал маленькую табличку, которая должна помочь разобраться:
Таблица Association, Aggregation and Composition #
- | Ассоциация | Агрегация | Композиция |
---|---|---|---|
Владелец | нет владельца | есть владелец | есть владелец |
Жизненный цикл | собственный цикл жизни | собственный цикл жизни | Цикл жизни владельца |
“Пара” примеров отношений между классами #
- Менеджер открывает ключ-картой дверь отдела.
- Java-программист работает на крупную IT-фирму
- Java-программист в подчинении у менеджера, как и весь его отдел.
- Менеджер несёт персональную ответственность за успешность проекта.
- Зарплата менеджера напрямую зависит от успешности проекта.
Менеджер и карта, первый пример #
Это ассоциация. Объекты живут собственной жизнью. Объекты взаимодействуют друг с другом в одном из методов.
Java-программист работает на крупную IT-фирму #
Это ассоциация.
Java-программист в подчинении у менеджера, как и весь его отдел. #
Агрегация. Менеджер агрегировал весь отдел.
Менеджер, Проект, Зарплата 4 и 5 #
Композиция. Есть явная связь между зарплатой и проектом. Работой и проектом.
Дополнительные ссылки #
- Association In Java – Explore the Concepts of Composition & Aggregation
- Understanding Association, Aggregation, and Composition
- Отношения между классами (объектами)
Домашнее задание #
- Создайте проект с Книгой, Жанром, Автором, Издательством
- Продумайте связи между объектами, необходимыми полями и поведением.
- Назовите типы связей между вашими объектами