ВИДЕОУРОК №24. Memento
Метафора
Программный код метафоры
Структура паттерна на языке UML
Структура паттерна на языке C#
«Когда использовать паттерн ?»
Назначение паттерна
Паттерн 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), некоторое время держит его у себя, а затем возвращает объекту-хозяину.
