На этом шаге рассмотрим отношения агрегации и зависимости между классами.
Отношения целое/часть между экземплярами классов выражаются отношениями агрегации. Отношения агрегации между классами абсолютно аналогичны отношениям агрегации между объектами этих классов.
Как показано на рис. 1, класс TemperatureController (Температурный контроллер) означает целое, а класс Heater (Нагреватель) — его часть, что полностью соответствует отношению агрегации между экземплярами этих классов, показанных в шаге 36, на рис. 2.
Рис.1. Агрегация
Класс TemperatureController демонстрирует агрегацию как включение по значению (containment by value). Это значит, что объект класса Heater не существует отдельно от содержащего его экземпляра класса TemperatureController. Периоды существования этих двух объектов тесно связаны между собой. При создании экземпляра класса TemperatureController одновременно создается экземпляр класса Heater.
Второй вид агрегации — композиция (composition) — является включением по ссылке (containment by reference). В этом случае класс TemperatureController по-прежнему означает целое, а экземпляр класса Heater по-прежнему представляет собой его часть, но клиент имеет косвенный доступ к нему. Следовательно, продолжительности существования этих объектов слабо связаны друг с другом. Экземпляры классов теперь можно создавать и уничтожать независимо.
Агрегация придает направленность отношению "целое/часть". Например, экземпляр класса Heater является частью экземпляра класса TemperatureController, но не наоборот. Разумеется, агрегация не всегда означает физическое включение. Например, несмотря на то что акционер владеет акциями, они не являются его физической частью. Кроме того, продолжительность существования каждого из этих объектов может быть совершенно разной, хотя концептуально отношение целого и части сохраняется (каждая акция является частью активов акционера). Представление этой агрегации может носить весьма косвенный характер.
Это отношение также является агрегацией, хотя и без физического включения. Необходимый признак агрегации таков: классы находятся в отношении агрегации друг с другом, только если между любыми двумя их объектами существует отношение "целое/часть".
Агрегацию часто путают с множественным наследованием. Сравнивая эти механизмы, следует помнить об их необходимых признаках. Если невозможно уверенно утверждать, что между двумя классами существует отношение "is а", то вместо наследования следует применить агрегацию или другое отношение.
Кроме наследования, агрегации и ассоциации между объектами существует другой тип отношений — зависимости (dependencies). Зависимость означает, что один из элементов каким-то образом зависит от другого. Изменение одного из таких элементов влияет на другой. Существует много разновидностей зависимости (их полный перечень можно найти в спецификации системы обозначений UML, разработанной компанией Object Management Group [Object Management Group's Web site: www.omg.org.]). Зависимости часто используются в архитектурных моделях (в которых один компонент системы, или пакет, зависит от другого), а также на уровне реализации (когда одна модель зависит от другой).
На следующем шаге рассмотрим взаимосвязь между классами и объектами.