Композиция является основой
многообразия окружающего нас мира. Мы
соединяем различные элементы в единой
сущности для придания ей требуемых свойств.
Комбинируя элементы, можно изменять свойства
сущности, которая их содержит. Поэтому
нельзя считать контейнер простой механической
смесью составляющих его элементов. Молекула
состоит из атомов, и каждый атом значим.
Изменяя количество или состав атомов,
мы изменяем свойства молекулы, получая
модификацию исходной молекулы или совершенно
иную молекулу. Каждая буква в слове значима
и, изменяя буквы или их местоположение,
мы получаем другое слово.
Рассматривая композиции,
нельзя не остановиться на вопросе качественных
изменений. Мы можем заменить в контейнере
один объект на другой, возможно даже,
что новый объект будет относиться к совсем
иному классу. Но при этом сам контейнер
не претерпит каких-либо качественных изменений.
Например, можно поменять двигатель в автомобиле
с карбюраторного на дизельный (конечно,
если позволяет интерфейс). При такой замене
автомобиль остается автомобилем. Но если
поменять шасси на воздушную «подушку»,
то автомобиль приобретет новое свойство
– перемещение по бездорожью, в том числе
и над водной поверхностью. При такой замене
автомобиль превратится в вездеход, то
есть будет получена сущность с новым набором
свойств. Можно сформулировать наследование
контейнеров, как замещение вложенных объектов
или добавления новых объектов с целью
получения новых свойств. Модификация контейнера,
выполняемая ради получения новых свойств,
аналогична модификации элементарного класса
за счёт замены существующих или добавления
иных методов, в результате создаётся новый
подкласс, обладающий модифицированным
набором свойств.
Одной из главных задач композиции
является организация взаимодействия между
вложенными элементами. Поскольку элементы
не имеют возможности непосредственно взаимодействовать
друг с другом, то это взаимодействие выполняется
опосредованно через контейнер. Логика
взаимодействия элементов при выполнении
некоторой задачи является частью логики
контейнера и реализуется в виде схемы.
Важность опосредованного взаимодействия
наиболее очевидна при рассмотрении контейнеров,
расположенных на высоких уровнях иерархии
системы. Здесь формы взаимодействия могут
регулироваться контейнером в зависимости
от состояния самого контейнера или состояния
вложенных объектов.
Контейнеры, образуемые из
элементов нижнего слоя иерархии, могут
иметь разную продолжительность жизни.
Устойчивые контейнеры используются различными
задачами, и срок их жизни может быть бесконечно
большим. Стабильные контейнеры создаются
под задачу и уничтожаются при завершении
задачи. Временные контейнеры создаются
в отдельном программном блоке и завершаются
при завершении исполнения этого блока.
Элементы, входящие в контейнер, могут
существовать столько же, сколько и контейнер
или меньше, но могут быть созданы и уничтожены
вне данного контейнера, то есть иметь
продолжительность жизни больше продолжительности
жизни контейнера. Такие элементы, как
правило, являются разделяемыми несколькими
контейнерами.
Область видимости любого элемента контейнера
ограничена. Система устанавливает прямую
и обратную связь между контейнером и каждым
из вложенных элементов. Если элементу
требуются какие-то ресурсы, то он обращается
к своему владельцу. Контейнер может предоставить
эти ресурсы, может обобщить запросы от
других элементов на тот же вид ресурсов,
а может просто делегировать запрос на
следующий высший уровень иерархии, если
запрашиваемые ресурсы не являются его
собственностью. При загрузке или создании
контейнера система может оптимизировать
транзитные запросы. Для этого достаточно
проверить, в каких ресурсах нуждается
каждый элемент контейнера. Если запрос
на этот ресурс не обрабатывается контейнером,
то система может сразу перенаправить запрос
на тот уровень, где производится управление
требуемым ресурсом. Такое решение позволяет,
не нарушая инкапсуляции, обеспечивать
эффективность исполнения.
|