Компоновщик (Composite)

Метафора

 

Для примера можно рассмотреть управление солдатами в строю. Существует строевой устав, который определяет, как управлять строем и согласно этого устава абсолютно не важно кому отдается приказ (например, «шагом марш») одному солдату или целому взводу. Соответственно в устав (если его в чистом виде считать паттерном «компоновщик») нельзя включить команду, которую может исполнить только один солдат, но не может исполнить группа, или наоборот.

 

Назначение

 

Паттерн описывает интерфейс, позволяющий работать с группой объектов или отдельным объектом одинаково.

Примером может служить графический редактор, где Вам понадобилось одновременно закрасить несколько примитивов на экране. Для этого вы выделяете их и нажимаете кнопку закрасить, при выделении формируется композиционный объект, который содержит все примитивы. Команда закрасить поочередно выполняется для каждого. При этом редактор работает (посылает команду «закрасить») с одним абстрактным классом «Примитив», который поддерживает операцию закрашивания.

Данный паттерн является относительно низкоуровневым и лежит в основе других паттернов. Команды объединяются в составные команды, декоратор является составным объектом, посетители часто обходят составные объекты иерархической формы.

 

Диаграмма

 

Компоновщик

Компоновщик

 

  • Component – базовый класс компонента, содержит операцию, а так же может содержать операции добавления, удаления и получения дочернего элемента.
  • Composite – составной объект, который делегирует выполнение операции всем дочерним.
  • Leaf – одиночный компонент, если операции с дочерними объектами лежат в базовом классе, он их не реализует, выдавая например исключение.
  • Client – обработчик компонентов, который благодаря общему интерфейсу работает одинаково как с одиночными, так и с составными объектами.

 

Пример