Паттерны проектирования в нотации языка UML
В сфере разработки программных систем наибольшее применение получили паттерны проектирования GoF, некоторые из них реализованы в популярных средах программирования. При этом паттерны проектирования могут быть представлены в наглядной форме с помощью рассмотренных обозначений языка UML.
Паттерн проектирования в контексте языка UML представляет собой параметризованную кооперацию вместе с описанием базовых принципов ее использования.
При изображении паттерна используется обозначение параметризованной кооперации языка UML (рис. 14.1), которая обозначается пунктирным эллипсом. В правый верхний угол эллипса встроен пунктирный прямоугольник, в котором перечислены параметры кооперации, которая представляет тот или иной паттерн.
Рис. 14.1. Изображение паттерна в форме параметризованной кооперации
В последующем параметры паттерна могут быть заменены различными классами, чтобы получить реализацию паттерна в рамках конкретной кооперации. Эти параметры специфицируют используемые классы в форме ролей классов в рассматриваемой подсистеме. При связывании или реализации паттерна любая линия помечается именем параметра паттерна, которое является именем роли соответствующей ассоциации. В дополнение к диаграммам кооперации особенности реализации отдельных паттернов представляются с помощью диаграмм последовательности.
Паттерны проектирования позволяют решать различные задачи, с которыми постоянно сталкиваются проектировщики объектно-ориентированных приложений. Ниже представлен полный список паттернов проектирования GoF и краткое описание назначения каждого из них (таблица 14.1).
1 | Abstract Factory | Абстрактная фабрика | Предоставляет интерфейс для создания множества связанных между собой или независимых объектов, конкретные классы которых неизвестны. |
2 | Adapter(синоним - Wrapper) | Адаптер (Обертка) | Преобразует существующий интерфейс класса в другой интерфейс, который понятен клиентам. При этом обеспечивает совместную работу классов, невозможную без данного паттерна из-за несовместимости интерфейсов. |
3 | Bridge | Мост | Отделяет абстракцию класса от его реализации, благодаря чему появляется возможность независимо изменять то и другое. |
4 | Builder | Строитель | Отделяет создание сложного объекта от его представления, позволяя использовать один и тот же процесс разработки для создания различных представлений. |
5 | Chain of Responsibility | Цепочка обязанностей | Позволяет избежать жесткой зависимости отправителя запроса от его получателя, при этом объекты-получатели связываются в цепочку, а запрос передается по цепочке, пока какой-то объект его не обработает. |
6 | Command | Команда | Инкапсулирует запрос в виде объекта, обеспечивая параметризацию клиентов типом запроса, установление очередности запросов, протоколирование запросов и отмену выполнения операций. |
7 | Composite | Компоновщик | Группирует объекты в иерархические структуры для представления отношений типа "часть-целое", что позволяет клиентам работать с единичными объектами так же, как с группами объектов. |
8 | Decorator | Декоратор | Применяется для расширения имеющейся функциональности и является альтернативой порождению подклассов на основе динамического назначения объектам новых операций. |
9 | Facade | Фасад | Предоставляет единый интерфейс к множеству операций или интерфейсов в системе на основе унифицированного интерфейса для облегчения работы с системой. |
10 | Factory Method | Фабричный метод | Определяет интерфейс для разработки объектов, при этом объекты данного класса могут быть созданы его подклассами. |
11 | Flyweight | Приспособленец | Использует принцип разделения для эффективной поддержки большого числа мелких объектов. |
12 | Interpreter | Интерпретатор | Для заданного языка определяет представление его грамматики на основе интерпретатора предложений языка, использующего это представление. |
13 | Iterator | Итератор | Дает возможность последовательно перебрать все элементы составного объекта, не раскрывая его внутреннего представления. |
14 | Mediator | Посредник | Определяет объект, в котором инкапсулировано знание о том, как взаимодействуют объекты из некоторого множества. Способствует уменьшению числа связей между объектами, позволяя им работать без явных ссылок друг на друга и независимо изменять схему взаимодействия. |
15 | Memento | Хранитель | Дает возможность получить и сохранить во внешней памяти внутреннее состояние объекта, чтобы позже объект можно было восстановить точно в таком же состоянии, не нарушая принципа инкапсуляции. |
16 | Observer | Наблюдатель | Специфицирует зависимость типа "один ко многим" между различными объектами, так что при изменении состояния одного объекта все зависящие от него получают извещение и автоматически обновляются. |
17 | Prototype | Прототип | Описывает виды создаваемых объектов с помощью прототипа, что позволяет создавать новые объекты путем копирования этого прототипа. |
18 | Proxy | Заместитель | Подменяет выбранный объект другим объектом для управления контроля доступа к исходному объекту. |
19 | Singleton | Одиночка | Для выбранного класса обеспечивает выполнение требования единственности экземпляра и предоставления к нему полного доступа. |
20 | State | Состояние | Позволяет выбранному объекту варьировать свое поведение при изменении внутреннего состояния. При этом создается впечатление, что изменился класс объекта. |
21 | Strategy | Стратегия | Определяет множество алгоритмов, инкапсулируя их все и позволяя подставлять один вместо другого. При этом можно изменять алгоритм независимо от клиента, который им пользуется. |
22 | Template Method | Шаблонный метод | Определяет структуру алгоритма, перераспределяя ответственность за некоторые его шаги на подклассы. При этом подклассы могут переопределять шаги алгоритма, не меняя его общей структуры. |
23 | Visitor | Посетитель | Позволяет определить новую операцию, не меняя описаний классов, у объектов которых она вызывается. |
В качестве примеров рассматриваются два паттерна проектирования, которые нашли наибольшее применение при проектировании программных систем: паттерны Фасад и Наблюдатель.