ПКС / ПКС. Материалы лекций
.pdf4. Шаблоны проектирования критических сервисов |
|
|
131 |
||
15) Состояние (State; Object for States) |
Само состояние имеет доступ к кон- |
|
|
тексту (к условиям работы кода в данный |
|
Шаблон Состояние позволяет выполнять переключение |
момент времени) и определяет возможности |
|
между различными вариантами использования данных и |
перехода в другие состояния. |
|
функций, предусматривая все возможные варианты таких |
if(cont.getState() == Start) {cont.setState(Start);} |
|
переключений через общий интерфейс доступа к таким |
if(cont.getState() == Stop) {/*уже установлено*/} |
|
вариантам работы кода. |
if(cont.getState() == Pause) {/*ошибка!!*/} |
|
область предоставления общей точки доступа для управления состоянием в зависимости от условий
|
область управ- |
|
область переключения между состояниями в зависимости от разрешен- |
ления «конечным |
|
автоматом» |
||
ных переходов (обычно показываются на UML-диаграмме состояний) |
||
|
4. Шаблоны проектирования критических сервисов |
|
132 |
16) Команда (Command; Transaction, Транзакция)
Шаблон Команда позволяет добавить слой взаимодействия между набором выполняемых команд (invoke) и набором исполняемого кода (execute), в зависимости от текущих условий применения каждого из действий.
Примеры: выполнение команд
вприложении: по сочетанию клавиш, по выбору действий с «контрОлом» (control, графический элемент управления),
при наборе управляющих строк
вконсольном приложении.
область инициализации (invoke) действий при аллокации (allocate,
распределения памяти под объекты) объек- тов-команд
область
выполнения
(execute) |
|
самих |
|
команд |
|
в зависи- |
|
мости от |
область управления |
выбора |
командами из поль- |
пользователя |
зовательского объекта |
4. Шаблоны проектирования критических сервисов |
|
133 |
16) Команда (Command; Transaction, Транзакция)
Создание и подготовка команд к выполнению
(invoking)
Вызов команд «Купить» (BuyStock) и сразу после этого – «Продать»
(SellStock) (executing)
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, «ловушка») для обработки событий |
|
|
|
является основным шаблоном проектирования |
встраивания |
область кода |
|
для задач системного программирования. |
«ловушки» |
«ловушки» |
|
|
(в неявном виде) |
(в явном виде) |
|