Проектирование, Архитектура и Конструирование Программных систем
Chain Of Responsibility
Chain Of Responsibility
Chain Of Responsibility
Chain Of Responsibility
Chain Of Responsibility
Chain Of Responsibility
Command
Command
Command
Command
Command
Iterator
Iterator
Iterator
Iterator
528.45K
Категория: ПрограммированиеПрограммирование

ПАКПС 6

1. Проектирование, Архитектура и Конструирование Программных систем

Университет Дубна
лекция 6
П.Сычев

2. Chain Of Responsibility

Тип: поведенческий
Синоним: нет
Назначение: позволяет избежать привязки отправителя запроса к конкретному
получателю, давая возможность обработать запрос нескольким объектам. Связывает
объекты – получатели в цепочку и передает запрос вдоль этой цепочки, пока его не
обработают.

3. Chain Of Responsibility

Мотивация:
Рассмотрим типичное Windows приложение. В любой момент пользователь может нажать
клавишу F1, ожидая получить подсказку.
Подсказка (Help), может быть как обычной – первая страница – оглавление, так и
контекстно зависимой – т.е. высвечивается страница, соответствующее активному в
данный момент окну приложения. Обычно это достигается вызовом службы Help с
идентификатором текущей страницы:
◦ Help.Show(helpCtx);
где helpCtx – индекс текущего окна.
Ситуация усложняется если программа допускает расширения в виде плагинов (plugin). Новая
функциональность, добавляемая с помощью плагина, может содержать как дополнительные
диалоговые окна, так и дополнительную пользовательскую документацию (help). Вопрос – как
интегрировать дополнительные страницы подсказок?

4. Chain Of Responsibility

Структура

5. Chain Of Responsibility

Реализация:
- Гарантия обработки запроса. Последний обработчик в цепочке должен гарантировано
обрабатывать любой запрос. Например, в случае подсказки – выдавать начальную
страницу документации, оглавление. В случае функционального запроса – вызвать
исключительную ситуацию «Function is not imlemented»;
- Добавление нового обработчика. Как правило, его ставят в начало списка, чтобы
гарантировать, что именно он будет обрабатывать запросы, относящиеся к его
компетенции;
- Обработчик может сделать часть работы, передав остаток работы следующему;
- Порядок обработчиков в списке может влиять на результат, если один и тот же запрос
могут обработать несколько обработчиков. Тогда такой запрос будет обработан первым из
них. Это следует иметь ввиду при реализации паттерна.

6. Chain Of Responsibility

Пример – автоматическая
банковская машина.

7. Chain Of Responsibility

Результаты:
(+) Ослабление связности. Шаблон освобождает клиента от необходимости «знать»
конкретного обработчика его запроса. Отправителю и получателю ничего не известно друг
о друге.
(+) Дополнительная гибкость при разделении обязанностей между объектами.
Изменить обработку запроса можно либо путем добавления нового обработчика, либо
перестановками обработчиков в цепочке.
(-) Обработка запроса не гарантирована.

8. Command

Тип: поведенческий.
Синоним: Action, Transaction.
Назначение: инкапсулирует действие, как объект, позволяя тем самым задавать
параметры обработки запросов, ставить эти действия в очередь, поддерживает
протоколирование и отмену результатов действия.

9. Command

Мотивация:
а) Заряженный курсор.
Во многих программах используется механизм «заряженный курсор». Например,
пользователь выбирает действие «удалить объект» и, далее, с помощью курсора выбирает
объект, который будет удален. Здесь важно, что момент определения действия отделен от
момента его выполнения.
В нашем примере векторного графического реждактора можно определить функцию
«закрасить фигуру выбранным цветом», так что пользователь сначало выбирает цвет
кисти, а затем последовательно закрашивает фигуры на панели, выбирая их курсором.
Можно и создание новых фигур реализовать с помощью этого шаблона. Тогда, выбрав
желаемую фигуру из палитры, пользователь создает новые экземпляры кликая на панели.

10. Command

б) Реализация «событий» в оконном приложении.
Действие, необходимое при нажатии на кнопку в окне, оформляется в виде команды,
ассоциированной с этой кнопкой.
Аналогично, действие, необходимое при нажатии пункта меню, также оформляется в виде
команды.

11. Command

Структура

12. Command

Реализация:
1. С помощью этого шаблона можно реализовать команду UnDo, т.е. вернуть систему в
состояние перед выполнением команды. Для этого необходимо добавить новый метод
UnDo и поля, необходимые для восстановления состояния.
Результаты:
(+) Паттерн Command отделяет объект, инициирующий операцию, от объекта, который
знает, как ее выполнить. Единственное, что должен знать инициатор, это как отправить
команду.
(+) Дополнительная гибкость: позволяет осуществлять динамическую замену команд,
использовать сложные составные команды, осуществлять отмену операций.

13. Iterator

Тип: поведенческий
Синоним: Cursor
Назначение: Предоставляет способ последовательного доступа ко всем элементам
составного объекта, не раскрывая его внутреннего представления.
Мотивация: Составной объект, такой как список, должен предоставлять способ доступа к
его элементам без раскрытия своей внутренней структуры. Более того, иногда нужно
перебирать элементы списка различными способами, в зависимости от конкретной
задачи. Но вы, вероятно, не хотите раздувать интерфейс списка операциями для
различных обходов, даже если они необходимы. Кроме того, иногда нужно иметь
несколько активных обходов одного списка одновременно. Было бы хорошо иметь единый
интерфейс для обхода разных типов составных объектов (т.е. полиморфная итерация).

14. Iterator

Паттерн Iterator позволяет все это делать. Ключевая идея состоит в том, чтобы
ответственность за доступ и обход переместить из составного объекта на объект Iterator,
который будет определять стандартный протокол обхода.
Абстракция Iterator имеет основополагающее значение для технологии, называемой
"обобщенное программирование". Эта технология четко разделяет такие понятия как
"алгоритм" и "структура данных". Мотивирующие факторы: способствование
компонентной разработке, повышение производительности и снижение расходов на
управление.
Рассмотрим пример. Если вы хотите одновременно поддерживать четыре вида структур
данных (массив, бинарное дерево, связанный список и хэш-таблица) и три алгоритма
(сортировка, поиск и слияние), то традиционный подход потребует 12 вариантов
конфигураций (четыре раза по три), в то время как обобщенное программирование
требует лишь 7 (четыре плюс три).

15. Iterator

Структура:

16. Iterator

Реализация:
1. Итератор хранит внутри себя текущую позицию. Это позволяет клиенту иметь несколько
активных итераторов к одной и той же коллекции;
2. Итераторы могут реализовывать разные алгоритмы обхода: обратный итератор, обход
дерева в иерархическом порядке или слева-направо и т.п.
3. Если в процессе обхода коллекция была изменена – итератор может стать нелегальным.
Необходимы методы контроля применимости итератора.
Результаты:
(+) Упрощает интерфейс аггрегатора – не нужны дополнительные методы доступа;
(-) Итераторы неустойчивы – необходим контроль за корректностью итератора.
English     Русский Правила