Паттерны проектирования в нотации языка UML
В сфере разработки программных систем наибольшее применение получили паттерны проектирования GoF, некоторые из них реализованы в популярных средах программирования. При этом паттерны проектирования могут быть представлены в наглядной форме с помощью рассмотренных обозначений языка UML.
Паттерн проектирования в контексте языка UML представляет собой параметризованную кооперацию вместе с описанием базовых принципов ее использования.
При изображении паттерна используется обозначение параметризованной кооперации языка UML (рис.9.8), которая обозначается пунктирным эллипсом. В правый верхний угол эллипса встроен пунктирный прямоугольник, в котором перечислены параметры кооперации, которая представляет тот или иной паттерн.
Рис. 9.8. Изображение паттерна в форме параметризованной кооперации
В последующем параметры паттерна могут быть заменены различными классами, чтобы получить реализацию паттерна в рамках конкретной кооперации. Эти параметры специфицируют используемые классы в форме ролей классов в рассматриваемой подсистеме. При связывании или реализации паттерна любая линия помечается именем параметра паттерна, которое является именем роли соответствующей ассоциации. В дополнение к диаграммам кооперации особенности реализации отдельных паттернов представляются с помощью диаграмм последовательности.
Паттерны проектирования позволяют решать различные задачи, с которыми постоянно сталкиваются проектировщики объектно-ориентированных приложений. Ниже представлен полный список паттернов проектирования GoF и краткое описание назначения каждого из них (таблица 9.1).
Таблица 9.1. Полный список паттернов проектирования GoF
№ | Название паттерна | Перевод | Назначение паттерна |
Abstract Factory | Абстрактная фабрика | Предоставляет интерфейс для создания множества связанных между собой или независимых объектов, конкретные классы которых неизвестны. | |
Adapter(синоним - Wrapper) | Адаптер (Обертка) | Преобразует существующий интерфейс класса в другой интерфейс, который понятен клиентам. При этом обеспечивает совместную работу классов, невозможную без данного паттерна из-за несовместимости интерфейсов. | |
Bridge | Мост | Отделяет абстракцию класса от его реализации, благодаря чему появляется возможность независимо изменять то и другое. | |
Builder | Строитель | Отделяет создание сложного объекта от его представления, позволяя использовать один и тот же процесс разработки для создания различных представлений. | |
Chain of Responsibility | Цепочка обязанностей | Позволяет избежать жесткой зависимости отправителя запроса от его получателя, при этом объекты-получатели связываются в цепочку, а запрос передается по цепочке, пока какой-то объект его не обработает. | |
Command | Команда | Инкапсулирует запрос в виде объекта, обеспечивая параметризацию клиентов типом запроса, установление очередности запросов, протоколирование запросов и отмену выполнения операций. | |
Composite | Компоновщик | Группирует объекты в иерархические структуры для представления отношений типа "часть-целое", что позволяет клиентам работать с единичными объектами так же, как с группами объектов. | |
Decorator | Декоратор | Применяется для расширения имеющейся функциональности и является альтернативой порождению подклассов на основе динамического назначения объектам новых операций. | |
Facade | Фасад | Предоставляет единый интерфейс к множеству операций или интерфейсов в системе на основе унифицированного интерфейса для облегчения работы с системой. | |
Factory Method | Фабричный метод | Определяет интерфейс для разработки объектов, при этом объекты данного класса могут быть созданы его подклассами. | |
Flyweight | Приспособленец | Использует принцип разделения для эффективной поддержки большого числа мелких объектов. | |
Interpreter | Интерпретатор | Для заданного языка определяет представление его грамматики на основе интерпретатора предложений языка, использующего это представление. | |
Iterator | Итератор | Дает возможность последовательно перебрать все элементы составного объекта, не раскрывая его внутреннего представления. | |
Mediator | Посредник | Определяет объект, в котором инкапсулировано знание о том, как взаимодействуют объекты из некоторого множества. Способствует уменьшению числа связей между объектами, позволяя им работать без явных ссылок друг на друга и независимо изменять схему взаимодействия. | |
Memento | Хранитель | Дает возможность получить и сохранить во внешней памяти внутреннее состояние объекта, чтобы позже объект можно было восстановить точно в таком же состоянии, не нарушая принципа инкапсуляции. | |
Observer | Наблюдатель | Специфицирует зависимость типа "один ко многим" между различными объектами, так что при изменении состояния одного объекта все зависящие от него получают извещение и автоматически обновляются. | |
Prototype | Прототип | Описывает виды создаваемых объектов с помощью прототипа, что позволяет создавать новые объекты путем копирования этого прототипа. | |
Proxy | Заместитель | Подменяет выбранный объект другим объектом для управления контролем доступа к исходному объекту. | |
Singleton | Одиночка | Для выбранного класса обеспечивает выполнение требования единственности экземпляра и предоставления к нему полного доступа. | |
State | Состояние | Позволяет выбранному объекту варьировать свое поведение при изменении внутреннего состояния. При этом создается впечатление, что изменился класс объекта. | |
Strategy | Стратегия | Определяет множество алгоритмов, инкапсулируя их все и позволяя подставлять один вместо другого. При этом можно изменять алгоритм независимо от клиента, который им пользуется. | |
Template Method | Шаблонный метод | Определяет структуру алгоритма, перераспределяя ответственность за некоторые его шаги на подклассы. При этом подклассы могут переопределять шаги алгоритма, не меняя его общей структуры. | |
Visitor | Посетитель | Позволяет определить новую операцию, не меняя описаний классов, у объектов которых она вызывается. |
В качестве примеров рассматриваются два паттерна проектирования, которые нашли наибольшее применение при проектировании программных систем: паттерны Фасад и Наблюдатель.