Паттерны проектирования в нотации языка UML
В сфере разработки программных систем наибольшее применение получили паттерны проектирования GoF, некоторые из них реализованы в популярных средах программирования. При этом паттерны проектирования могут быть представлены в наглядной форме с помощью рассмотренных обозначений языка UML.
Паттерн проектирования в контексте языка UML представляет собой параметризованную кооперацию вместе с описанием базовых принципов ее использования.
При изображении паттерна используется обозначение параметризованной кооперации языка UML (
рис.
14.1), которая обозначается пунктирным эллипсом. В правый верхний угол эллипса встроен пунктирный прямоугольник, в котором перечислены параметры кооперации, которая представляет тот или иной паттерн.
Рис.
14.1.
Изображение паттерна в форме параметризованной кооперации
В последующем параметры паттерна могут быть заменены различными классами, чтобы получить реализацию паттерна в рамках конкретной кооперации. Эти параметры специфицируют используемые классы в форме ролей классов в рассматриваемой подсистеме. При связывании или реализации паттерна любая линия помечается именем параметра паттерна, которое является именем роли соответствующей ассоциации. В дополнение к диаграммам кооперации особенности реализации отдельных паттернов представляются с помощью диаграмм последовательности.
Паттерны проектирования позволяют решать различные задачи, с которыми постоянно сталкиваются проектировщики объектно-ориентированных приложений. Ниже представлен полный список паттернов проектирования GoF и краткое описание назначения каждого из них (
таблица
14.1).
Таблица
14.1.
Полный список паттернов проектирования GoF
№ |
Название паттерна |
Перевод |
Назначение паттерна |
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 |
Посетитель |
Позволяет определить новую операцию, не меняя описаний классов, у объектов которых она вызывается. |
В качестве примеров рассматриваются два паттерна проектирования, которые нашли наибольшее применение при проектировании программных систем: паттерны Фасад и Наблюдатель.