Слайд 2Что такое компоновщик ?
Компоновщик (англ. Composite pattern) — структурный шаблон проектирования, объединяющий объекты в древовидную структуру для
представления иерархии от частного к целому. Компоновщик позволяет клиентам обращаться к отдельным объектам и к группам объектов одинаково.
Слайд 3Образно реализацию паттерна можно представить в виде меню, которое имеет различные пункты.
Эти пункты могут содержать подменю, в которых, в свою очередь, также имеются пункты. То есть пункт меню служит с одной стороны частью меню, а с другой стороны еще одним меню. В итоге мы однообразно можем работать как с пунктом меню, так и со всем меню в целом.
Слайд 4Плюсы и минусы
Достоинства паттерна Composite
В систему легко добавлять новые примитивные или составные
объекты, так как паттерн Composite использует общий базовый класс Component.
Код клиента имеет простую структуру – примитивные и составные объекты обрабатываются одинаковым образом.
Паттерн Composite позволяет легко обойти все узлы древовидной структуры
Недостатки паттерна Composite
Неудобно осуществить запрет на добавление в составной объект Composite объектов определенных типов. Так, например, в состав римской армии не могут входить боевые слоны.
Слайд 5Когда использовать компоновщик?
Когда объекты должны быть реализованы в виде иерархической древовидной структуры
Когда
клиенты единообразно должны управлять как целыми объектами, так и их составными частями. То есть целое и его части должны реализовать один и тот же интерфейс
С помощью UML шаблон компоновщик можно представить следующим образом:
Слайд 6Формальное определение паттерна на C# могло бы выглядеть так:
Слайд 8Участники
Component: определяет интерфейс для всех компонентов в древовидной структуре
Composite: представляет компонент, который
может содержать другие компоненты и реализует механизм для их добавления и удаления
Leaf: представляет отдельный компонент, который не может содержать другие компоненты
Client: клиент, который использует компоненты
Слайд 9Пример. Нужно создать объект файловой системы. Файловую систему составляют папки и файлы.
Каждая папка также может включать в себя папки и файлы. То есть получается древовидная иерархическая структура, где с вложенными папками нам надо работать также, как и с папками, которые их содержат. Для реализации данной задачи и воспользуемся паттерном Компоновщик:
Слайд 11В итоге подобная система обладает неплохой гибкостью: если мы захотим добавить новый
вид компонентов, нам достаточно унаследовать новый класс от Component.
И также применяя компоновщик, мы легко можем обойти все узлы древовидной структуры.