Хранитель (Memento) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Достоинства и недостатки) |
Admin (обсуждение | вклад) (→Пример) |
||
Строка 27: | Строка 27: | ||
=== Пример === | === Пример === | ||
+ | class Originator | ||
+ | { | ||
+ | string state; | ||
+ | |||
+ | public string State | ||
+ | { | ||
+ | get { return state; } | ||
+ | set | ||
+ | { | ||
+ | state = value; | ||
+ | Console.WriteLine("State = " + state); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public Memento CreateMemento() | ||
+ | { | ||
+ | return new Memento(state); | ||
+ | } | ||
+ | |||
+ | public void SetMemento(Memento memento) | ||
+ | { | ||
+ | Console.WriteLine("Restoring state..."); | ||
+ | State = memento.State; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Memento | ||
+ | { | ||
+ | string state; | ||
+ | |||
+ | public Memento(string state) | ||
+ | { | ||
+ | this.state = state; | ||
+ | } | ||
+ | |||
+ | public string State | ||
+ | { | ||
+ | get { return state; } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Caretaker | ||
+ | { | ||
+ | Memento memento; | ||
+ | |||
+ | public Memento Memento | ||
+ | { | ||
+ | set { memento = value; } | ||
+ | get { return memento; } | ||
+ | } | ||
+ | } | ||
=== Достоинства и недостатки === | === Достоинства и недостатки === |
Версия 10:34, 21 июля 2014
Назначение
Хранитель - это объект, в котором сохраняется состояние другого объекта - хозяина хранителя. Это необходимо для того чтобы хозяин мог записать в хранитель некоторую контрольную точку - своё текущее состояние, а потом вернуться к этому состоянию.
Описание
Сохранение внутреннего состояния необходимо для механизмов отката и позволяет пользователю отменить пробную операцию или восстановиться после ошибки.
Для отката необходимо чтобы объект-Хозяин предоставил объект-Хранитель для записи контрольной точки состояния Хозяина. Только Хозяину разрешено записывать и считывать информацию из Хранителя.
Впоследствии Хозяин может восстановить своё состояние по информации, записанной в Хранителе.
Реализация
Диаграмма классов
Участники
- Memento (Хранитель)
- Сохраняет внутреннее состояние объекта Originator (Хозяин).
- Запрещает доступ к своему содержимому всем объектам кроме Хозяина.
- У Хранителя - два интерфейса - для Хозяина (сохранение и восстановление состояния) и для остальных - только ссылка на Хранителя как единое целое.
- Originator (Хозяин)
- Создает Хранитель, содержащий снимок текущего состояния
- Использует Хранитель для восстановления состояния
- Caretaker (Посыльный)
- Хранит переменную Хранителя и не производит над ним никаких других операций
Пример
class Originator {
string state;
public string State { get { return state; } set { state = value; Console.WriteLine("State = " + state); } }
public Memento CreateMemento() { return new Memento(state); }
public void SetMemento(Memento memento) { Console.WriteLine("Restoring state..."); State = memento.State; }
}
class Memento {
string state;
public Memento(string state) { this.state = state; }
public string State { get { return state; } }
}
class Caretaker {
Memento memento;
public Memento Memento { set { memento = value; } get { return memento; } }
}
Достоинства и недостатки
- Позволяет избежать раскрытия информации о внутреннем устройстве Хозяина
- Возможные издержки на копирование большого объема информации при сохранении
- В некоторых языках сложно организовать наличие широкого и узкого интерфейса к хранителю
- Посыльный отвечает за хранение Хранителя, но не знает, сколько памяти в нем хранится, что может приводить к неоправданным расходам памяти