Паттерн Composite (Компоновщик).

Компоновщик — это шаблон проектирования, позволяющий работать с иерархиями различных объектов, как с объектами одного типа. Наиболее наглядный пример — пользовательский интерфейс, который описывается древовидной структурой и может содержать в себе различные элементы — Button (кнопка), Label(текстовая метка) и так далее. Данные простые элементы могут располагаться внутри более сложных, например, Panel — на которой могут располагаться другие элементы. Или другой пример — графический редактор, представляющий набор базовых примитивов, которые могут быть вложенными друг в друга. Наконец, третий пример — это разбор предложения, где символ, часть слова, слово и предложение также могут быть представлены в виде иерархии объектов. При это вам нужен какой-то универсальный способ выполнить обход дерева, работая с различными компонентами, используя единый интерфейс доступа к примитивным и составным объектам. Ниже приведена диаграмма, описывающая основных участников данного паттерна:

composite_pattern

Leaf(листовой узел) — представляет простой объект, который не включает в себя другие объекты.

Composite(композиция) — составной объект, который может включать в себя другие объекты.

Component(компонент) — единый интерфейс для всех объектов.

В общем, применение данного паттерна всегда уместно, если вы имеете какую-то иерархически построенную конструкцию, состоящую из некоторого набора более простых(примитивных) объектов. Мы разберем пример с элементами графического редактора, где каждый графический объект, будь то примитив или составной объект, реализует общий интерфейс Component.

Изображение может состоять из простых элементов вроде Circle(круг), Rectangle(прямоугольник) и Line(линия). А может и из более сложных, например, фигуры также могут вкладываться друг в друга. Для описания составного контейнерного объекта, который может включать в себя сразу несколько объектов введем класс GroupComponent, представляющую группу графических компонентов на экране.

Рассмотрим реализацию данного паттерна на языке Java.

Итак, сначала приведем листинг единого для всех графических компонентов интерфейса Component:

Операции add() и remove() будут реализовываться только контейнерными типами, которые описывают составные объекты. Операция draw() реализуется каждым объектом. Далее приведем реализацию одного из классов примитивных объектов — Circle.

Как мы и говорили, операции add() и remove() для простых объектов не реализуются, поэтому в случае их использования мы выбрасываем исключение UnsupportedOperationException(неподдерживаемая операция). А метод draw() реализуется всеми компонентами — простыми и составными.

Теперь перейдем к реализации класса составного объекта — GroupComponent:

GroupComponent может содержать в себе несколько компонентов. Их мы сохраняем в списке LinkedList, который может инициализироваться значениями, переданными в конструкторе. Обратите внимание, что мы используем метод с переменным числом аргументов. Также мы реализуем методы add() и remove(), которые просто добавляют и удаляют компоненты из списка.

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

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *