Видео курс Шаблоны проектирования

Основные темы, рассматриваемые на уроке:
00:27 1 Метафора
04:16 2 Программный код метафоры
07:24 3 Структура паттерна на языке UML
08:01 4 Структура паттерна на языке C#
09:32 5 «Когда использовать паттерн ?»
16:52 6 Назначение паттерна

Видео урок посвящен поведенческому шаблоны проектирования Memento (хранитель), который не нарушая инкапсуляции, фиксирует и выносит за пределы объекта-хозяина его внутреннее состояние так, чтобы позднее это вынесенное состояние можно было восстановить в исходном объекте-хозяине.

Для просмотра полной версии видеокурса и получения доступа к дополнительным учебным материалам Вам необходимо оформить подписку
Оформить подписку

Паттерн Memento

Название

Хранитель

Также известен как

Token (Лексема)

Классификация

По цели: поведенческий

По применимости: к объектам

Частота использования

Низкая                  -   1 2 3 4 5

Назначение

Паттерн Memento - не нарушая инкапсуляции, фиксирует и выносит за пределы объекта-хозяина его внутреннее состояние так, чтобы позднее это вынесенное состояние можно было восстановить в исходном объекте-хозяине.

Введение

Воспользуемся метафорой для описания работы паттерна Memento. Представьте себе, что Вы приобрели робота ASIMO и отправились с ним на прогулку, дошли до городского пляжа и решили искупаться. Вы сняли с себя одежду, сложили одежду в рюкзак, отдали рюкзак роботу, а сами пошли в воду. Задача робота – стеречь рюкзак. Инженеры HONDA пока еще не научили ASIMO открывать рюкзаки, поэтому он не сможет получить доступ к вещам и, например, поменять Ваши джинсы на новый сервопривод или аккумулятор.

Поплавав, Вы вышли из воды на берег, взяли рюкзак у робота, достали из рюкзака одежду и одели одежду на себя.

Рассмотрим основных участников паттерна Memento:

Важно помнить, что состояние объекта – это набор значений полей этого объекта. Одежда человека может входить в понятие одной из разновидностей состояний человека, так как одежду можно описать в виде набора переменных, принадлежащих объекту-человеку. И зачастую, когда нас просят описать человека, то мы помимо биометрических данных, зачастую указываем фасон и цвет одежды в которую одет человек.

Человек (Man) – хозяин (сложный объект со сложной конфигурацией состояния), которому по ряду причин потребовалось изменить свое состояние «из одетого в раздетого», а потом восстановить свое состояние обратно в первоначальный вид «из раздетого в одетого».

Рюкзак (Backpack) – хранитель (объект для хранения в себе копии состояния хозяина). Рюкзак с одеждой (состоянием хозяина) переходит из рук хозяина в руки робота, а позднее обратно из рук робота в руки хозяина. Это удобно, потому что возможно у робота есть еще и сумка с предыдущим состоянием хозяина, например, со смокингом со вчерашнего посещения оперы.

Робот (Robot) – посыльный (объект для ношения рюкзаков и сумок с состояниями хозяина) в любой момент готов дать хозяину нужную сумку или рюкзак с определенным набором вещей (предыдущие состояния). Человеку не требуется заботиться о поиске нужной конфигурации состояния, за него всю заботу за конфигурацию и хранение состояний берет на себя робот.

Из сказанного выше легко сформировать модель и реализовать ее программно.

См. пример к главе: \018_Memento\002_Memento

Структура паттерна на языке UML

См. пример к главе: \018_Memento\001_Memento

Структура паттерна на языке C#

См. пример к главе: \018_Memento\001_Memento

Участники

  • Memento - Хранитель:

Хранит в себе состояние объекта-хозяина класса Originator. Размер хранимого состояния может быть разный и зависит от потребностей хозяина. Объект-хранитель должен запрещать кому бы то ни было, кроме объекта-хозяина получать доступ к хранимому состоянию.

  • Originator - Хозяин:

Создает объекта-хранителя и помещает в него свое текущее внутреннее состояние. Впоследствии использует объекта-хранителя для восстановления своего ранее сохраненного состояния.

  • Caretaker - Посыльный:

Отвечает за сохранность объекта-хранителя и не производит над ним никаких действий, и не исследует его внутреннее содержимое.

Отношения между участниками

Отношения между классами

  • Класс Originator связан связью отношения зависимости с классом Memento.
  • Класс Caretaker связан связью отношения агрегации с классом Memento.

Отношения между объектами

  • Объект-посыльный (Caretaker) получает от объекта-хозяина (Originator) объект-хранитель (Memento), некоторое время держит его у себя, а затем возвращает объекту-хозяину.

© 2017 ITVDN, все права защищены