Какие виды отношений существуют в структурной диаграмме классов?
В UML-диаграмме классов выделяют несколько типов отношений, которые описывают связи между классами и их экземплярами. Понимание различий между ними критически важно для корректного проектирования и чтения диаграмм.
Взаимосвязи классов
Обобщение (Generalization) показывает, что один класс (подтип) является частной формой другого (супертип). Любой экземпляр подтипа является также экземпляром супертипа. На диаграмме изображается сплошной линией со стрелкой-треугольником, направленной к супертипу. Это то же самое, что наследование (extends) в Java, или отношение «is a».
Пример: «Табурет» является подтипом «Мебели» — табурет is a мебель.
Реализация (Realization) — отношение, в котором один элемент (клиент) реализует поведение, заданное другим (поставщиком). Поставщик, как правило, является интерфейсом или абстрактным классом. На диаграмме изображается пунктирной линией со стрелкой-треугольником. В Java это implements.
Пример: «Кровать» реализует интерфейс «Мебель для сна».
Взаимосвязи объектов (экземпляров классов)
Зависимость (Dependency) — самая слабая связь. Означает, что изменение класса-поставщика может повлиять на зависимый класс, но не наоборот. Возникает, когда объект используется как параметр метода, локальная переменная или возвращаемое значение. На диаграмме — пунктирная стрелка.
Пример: «Расписание занятий» зависит от «Списка предметов». При изменении списка предметов расписание вынуждено измениться, но не наоборот.
Ассоциация (Association) — структурная связь между классами, показывающая, что объекты одного класса связаны с объектами другого. Ассоциация может быть именованной и иметь направление навигации. Это общий случай, частными формами которого являются агрегация и композиция. На диаграмме — сплошная линия.
Пример: «Студент» и «Университет» связаны ассоциацией «учится в».
Агрегация (Aggregation) — разновидность ассоциации, отношение «целое — часть» по ссылке. Части могут существовать независимо от контейнера: если контейнер уничтожен, его содержимое продолжает существовать. На диаграмме — сплошная линия с пустым ромбом на стороне «целого».
Пример: «Группа» состоит из «Студентов», но студент существует и без группы.
Композиция (Composition) — строгий вариант агрегации, отношение «целое — часть» по значению. Время жизни частей жёстко зависит от контейнера: при уничтожении контейнера уничтожается и всё его содержимое. На диаграмме — сплошная линия с закрашенным ромбом на стороне «целого».
Пример: «Факультет» является частью «Университета» и не может существовать без него.
Сравнение отношений
| Отношение | Сила связи | Обозначение | Аналог в Java | Пример |
|---|---|---|---|---|
| Зависимость | Слабая | Пунктирная стрелка | Параметр метода, локальная переменная | Сервис использует DTO |
| Ассоциация | Средняя | Сплошная линия | Поле класса | Студент ↔ Университет |
| Агрегация | Средняя+ | Пустой ромб | Поле-коллекция (независимое время жизни) | Группа ◇→ Студент |
| Композиция | Сильная | Закрашенный ромб | Поле-коллекция (зависимое время жизни) | Университет ◆→ Факультет |
| Обобщение | Наследование | Пустой треугольник | extends |
Табурет → Мебель |
| Реализация | Контракт | Пунктир + треугольник | implements |
Кровать → МебельДляСна |
Мощность (кратность) отношений
Мощность указывает число связей между экземплярами классов на каждом конце ассоциации.
| Нотация | Значение | Пример |
|---|---|---|
0..1 |
Ноль или один экземпляр | У кошки может быть или не быть хозяина |
1 |
Обязательно один экземпляр | У кошки одна мать |
0..* или * |
Ноль или более экземпляров | У кошки могут быть котята, а может и не быть |
1..* |
Один или более экземпляров | У кошки есть хотя бы одно место для сна |
Общие взаимосвязи
Зависимость на общем уровне — это слабая форма отношения использования, при котором изменение спецификации одного элемента влечёт за собой изменение другого. Зависимость может быть между экземплярами, классами или экземпляром и классом. Объект может выступать в форме параметра, локальной переменной или возвращаемого значения.
Уточнение (Refinement) — отношение между элементами на разных уровнях детализации. Один пакет уточняет другой, если содержит те же элементы, но в более подробном представлении. Используется для перехода от абстрактной модели к детальной.
На собеседовании: это один из самых популярных вопросов по UML. Интервьюер хочет услышать чёткую разницу между агрегацией и композицией (время жизни частей), между ассоциацией и зависимостью (сила связи), а также уверенное сопоставление с конструкциями Java —
extends,implements, поле класса, параметр метода. Если можете нарисовать на доске пример с ромбами и стрелками — это сильный плюс.