
ПКС / Design_patterns_Лекции все_114-146
.pdf
4. Шаблоны проектирования критических сервисов |
|
134 |
17) Обозреватель (Observer; Publish-Subscribe, “Публикатор-Подписчики”)
Шаблон Обозреватель позволяет cмоделировать соотношение «один-к-многим»
(“one-many”, one2many): управляющий объект (Subject, “one”) хранит список взаимосвязей с управляемыми объектами (Observer, “many”) и оповещает их об изменениях; управляемые объекты (“many”) предоставляют информацию об изменениях
«центральный» объект (“one”), используя ссылку.
В Обозревателе |
область «читателей |
|
блога» |
||
моделируется |
||
|
||
механизм оповещения |
|
|
о новых событиях |
|
|
(т.е. коммуникация |
|
|
в основном |
|
|
односторонняя – |
|
|
от «блогера» к |
|
|
«подписчикам блога»). |
|
область проектирования и разработки «блога»

4. Шаблоны проектирования критических сервисов |
|
135 |
17) Обозреватель (Observer)
push model
(модель с активным источником данных и пассивными приемниками)
Обобщенный шаблон MVC (Model-View-Controller)
на примере имплементации паттерна Observer
pull model
(модель с пассивным источником данных и активными приемниками)
«Модель-Представление-Взаимодействие» (MVC) представляет собой набор характеристик (Model), который можно создать в разных вариантах (View) с помощью набора операций (Controller).

4. Шаблоны проектирования критических сервисов |
|
136 |
18) Медиатор (Mediator, Посредник)
Шаблон Медиатор предоставляет интерфейс для коммуникации («общения» путем отправки и приема сообщений) одинаково представимых объектов.
Медиатор позволяет моделировать соотношение «многие-ко-многим» (“many-many”, “many2many”). Примеры: чат, мессенджер, диспетчер задач, окно взаимодействия GUI (диалоговое окно, окно настроек),.. В частности, в качестве одинаково представимых объектов часто используются «контрОлы» (Control, графические элементы управления:
кнопки, чекбоксы, формы..)
область реализации одинаково |
|
|
объект-диспетчер |
|
|
|
|
|
|
представимых объектов (User), |
|
|
|
|
которые взаимодействуют через |
|
|
|
|
интерфейс для коммуникации |
|
|
|
|
(ChatRoom) |
|
|
|
|
любой «участник» через объект-диспетчер «общается» с другим |
область управ- |
|||
|
|
|
|
ления «чатом» |
1 |
* |
* |
1 |
|

4. Шаблоны проектирования критических сервисов |
|
137 |
18) Медиатор (Mediator, Посредник)
создание объектов
передача разрешения на отправку сообщений Зарегистрированным пользователям и Гостям

4. Шаблоны проектирования критических сервисов |
|
138 |
19) Хранитель (Memento, “Сувенир”; Token, Токен, Кадр стандартного формата, Маркер)
Шаблон Хранитель позволяет реализовать функции сохранения и восстановления (Save/Restore) копий дампа (dump) приложения, либо фрагмента приложения, либо базы данных, а также функции «шаг назад/шаг вперед» (Undo/Redo).
область хранилища сохраняемых |
область пользователя приложением |
и восстанавливаемых объектов, |
с функциями «отменить/вернуть» |
и сами |
(Undo/Redo) |
эти «до- |
и доступа к |
кументы» |
ранее откры- |
|
тым «доку- |
число полностью |
ментам» |
|
|
сохраняемых копий |
|
«документов» |
|
число сохраняемых изменений |
область доступа к Undo/Redo |
|
копий «документов» |
||
|

4. Шаблоны проектирования критических сервисов |
|
139 |
19) Хранитель (Memento, “Сувенир”; Token, Токен, Кадр стандартного формата, Маркер)
Шаблон Хранитель часто используют для циклической перезаписи состояний (в системах видеонаблюдения,...).
блок «запоминания» дампа состояний или изменения состояний: вызывается объект Originator, обрабатывающий «кадр» Memento, который сохраняется в хра-
нилище CareTaker
блок извлечения дампа состояний или изменения состояний
дополнитель- |
ное расчетное |
смещение ин- |
дексов, чтобы все 3 |
состояния не переза- |
писывать каждый раз |
например, для 3х изменений состояния для функции Undo/Redo может быть создан массив из 6 состояний: используются 0,1,2 перезаписываются все 3),затем 1,2,3 (добавляется одно), затем 2,3,4(еще одно),затем 3,4,5 (еще одно),затем 0,1,2 (все 3 состояния на перезапись).

4. Шаблоны проектирования критических сервисов |
|
||
140 |
|||
20) Шаблонный метод (Template method; Hook, “Ловушка”) |
|
|
|
Шаблон «Ловушка» представляет механизм |
|
область объектов |
|
неявного встраивания кода, который при |
|
|
|
определенных условиях может быть выполнен. |
|
пользователя, |
|
|
|
обрабатывающих |
|
Примеры использования: |
|
код «ловушки» |
|
- Вирусы (virus) и средства защиты (firewall, |
|
|
|
antivirus,..); |
|
|
|
- «Лазейки» (backdoor): часто используются для |
|
|
|
отладки и тестирования; |
|
|
|
- Плагины (plugin): встраиваемые библиотеки |
|
|
|
(“dll”); |
|
|
|
- Дополнения (extenstion): встраиваемые |
|
|
|
исполняемые файлы (“exe”); |
|
super. |
|
- Системы обновления приложений; |
|
|
|
|
|
|
|
- Обработка событий (event handler). |
|
|
|
private FormMain::ButtonOpenClick( |
|
|
|
Control sender, Events ev) |
область |
|
|
«Хук» (hook, «ловушка») для обработки событий |
|
|
|
является основным шаблоном проектирования |
встраивания |
область кода |
|
для задач системного программирования. |
«ловушки» |
«ловушки» |
|
|
(в неявном виде) |
(в явном виде) |
|

4. Шаблоны проектирования критических сервисов |
|
141 |
21) Цепочка обязанностей (Chain Of Responsibility)
Шаблон «Цепочка обязанностей» позволяет смоделировать единообразную (через общий интерфейс) структуру объектов, связанных разной степенью ответственности выполнения действий: чем больше уровень вложения («перекладывания» ответственности), тем более глобальные действия применяются.
Примеры:
Обработка действий внутри предприятия, учитывая схему подчинения.
Обработка действий при выполнении типовой задачи, обусловленной пользовательским запросом (обработка нажатия клавиши «F1» пользователем: сначала ближайшим контрОлом, затем соответствующим окном настроек, затем еще более главным окном).
область
обращения к «логу»
область
реализации
рекурсив-
ного вызова объектов «лога»
область обработки «лога»: более высокий уровень (_level) – для более «ответственных» решений

4. Шаблоны проектирования критических сервисов |
|
142 |
21) Цепочка обязанностей (Chain Of Responsibility)
Шаблон «Цепочка обязанностей» реализуются с помощью «неявного» интер-
фейса (AbstractLogger), в
котором представлена логика «перекладывания» отвественности на внутренний объект такого же типа
(#nextLogger), пока его зна-
чение не null.

4. Шаблоны проектирования критических сервисов |
|
143 |
22) Посетитель (Visitor, “Визитер”)
Шаблон Визитер (Посетитель) предназначен для обработки структур: их отображения, расчета (одинаковых действий над конкретными типовыми объектами). Примеры: дерево каталогов, подсказки (hint).
область структуры данных (обычно это Комповщик)
область контекстных объектов-«визитеров»,
привязанных к определенной структуре данных
область обращения пользователя к структуре, обычно древовидной (реализованной с помощью\
Компоновщика).