Компоновщик
Composite
Назначение
Компоновщик (Composite) - структурный паттерн проектирования, который позволяет сгруппировать объекты в древовидные структуры для представления иерархий "часть-целое". Позволяет клиентам единообразно трактовать индивидуальные и составные объекты.
Используется в случаях, когда:
Необходимо объединять группы схожих объектов и управлять ими.
Объекты могут быть как примитивными (элементарными), так и составными (сложными). Составной объект может включать в себя коллекции других объектов, образуя сложные древовидные структуры.
Код клиента работает с примитивными и составными объектами единообразно.
Решаемые задачи
композиция объектов
Дает возможность представления иерархии объектов вида часть-целое. С помощью композиции можно создавать древовидные структуры объектов, группировать объекты в контейнеры и управлять ими единообразно.
предоставление единообразного интерфейса
Единообразная трактовка клиентами составных и индивидуальных объектов, то есть паттерн компоновщик позволяет клиентам взаимодействовать с отдельными объектами и группами объектов (составными объектами) через единый интерфейс.
создание рекурсивных операций
Паттерн компоновщик позволяет выполнять операции на составных объектах рекурсивно. Когда операция вызывается на составном объекте, он автоматически распространяет операцию на все объекты в иерархии, включая объекты, содержащие другие объекты. Происходит рекурсивный проход по иерархии. Таким образом, можно легко применять операции как к отдельным объектам, так и ко всему дереву объектов.
UML диаграмма
Преимущества
упрощение архитектуры клиентского кода
Предоставление клиентскому коду удобного и единого интерфейса для работы как с отдельными, так и с составными объектами позволяет ему работать с иерархией объектов без необходимости проверять их типы и выбирать разные пути обработки.
повышение гибкости и расширяемости системы за счет добавления новых компонентов в иерархию без изменения существующего кода
возможность выполнения рекурсивных операций на составных объектах
предоставление удобных методов для добавления, удаления и обхода компонентов в иерархии объектов
Недостатки
потребность в создании сущности, отвечающей за за логику сборки компоновщика, которая может оказаться нетривиальной
нетривиальная логика обхода и работы с сущностью как с контейнером, если в компоновщике содержатся другие компоновщики
потеря типизации
Использование общего интерфейса может привести к потере типизации и нарушению статической проверки типов. Появляется необходимость решать проблему типизации вынесением всех методов из компоновщика в класс компонента. В свою очередь, это приводит к следующей проблеме
появление нелогичных операций
Максимизация интерфейса класса компонент, приводит к тому, что у подклассов появляются нелогичные операции
Связь с другими паттернами
Last updated
Was this helpful?