398 Глава 18. Уточнение отношений, выявленных при анализе
Композит имеет исключительное право владения и ответственности
за свои части.
Резюмировать семантику композиции можно следующим образом:
• одновременно части могут принадлежать только одному композиту –
совместное владение частями невозможно;
• композит обладает исключительной ответственностью за все свои
части; это означает, что он отвечает за их создание и уничтожение;
• композит может высвобождать части, передавая ответственность
за них другому объекту;
• в случае уничтожения композита он должен или уничтожить все
свои части, или передать ответственность за них другому объекту.
Поскольку композит обладает исключительной ответственностью за
жизненный цикл и управление своими частями, то при создании объ
ект композита часто создает и свои части. Аналогично при уничтоже
нии композита он должен уничтожить все свои части или организо
вать их передачу другому композиту.
Несмотря на то, что существуют и иерархии, и сети рефлексивной аг
регации, для рефлексивной композиции возможны только иерархии.
В этом состоит еще одно отличие между агрегацией и композицией,
которое объясняется тем, что в композиции объектчасть в любой мо
мент времени может быть частью только одного композита.
18.5.1. Композиция и атрибуты
Часть композита эквивалентна атрибуту.
Рассматривая семантику композиции, можно заметить, что она очень
похожа на семантику атрибутов. Жизненный цикл в обоих случаях
контролируется владельцами. И части, и атрибуты не могут независи
мо существовать вне своих владельцев. В сущности, атрибуты – это
точный эквивалент отношения композиции между классом композита
и классом атрибута. Тогда зачем нужны два способа описания одного
и того же? На это есть две причины:
• Типом атрибута может быть простой тип данных. В некоторых гиб
ридных ОО языках программирования, таких как C++ и Java, есть
простые типы, например int и double, которые не являются класса
ми. Их можно было бы моделировать как классы, обозначенные
стереотипом «primitive», но это загромождало бы модель. Простые
типы всегда должны моделироваться как атрибуты.
• Существуют определенные, широко используемые утилитные клас
сы, такие как Time, Date и String. Если бы каждый раз приходилось
моделировать эти классы с помощью отношения композиции класса