Хранитель (Memento) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Общая диаграмма классов для паттерна Хранитель) |
Admin (обсуждение | вклад) (→Участники) |
||
(не показаны 32 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
[[Страница_курса_Паттерны_проектирования| К основной странице курса]] | [[Страница_курса_Паттерны_проектирования| К основной странице курса]] | ||
__NOTOC__ | __NOTOC__ | ||
+ | === Назначение === | ||
+ | Хранитель - это объект, в котором сохраняется состояние другого объекта - хозяина хранителя. Это необходимо для того чтобы хозяин мог записать в хранитель некоторую контрольную точку - своё текущее состояние, а потом вернуться к этому состоянию. | ||
+ | |||
=== Описание === | === Описание === | ||
+ | Сохранение внутреннего состояния необходимо для механизмов отката и позволяет пользователю отменить пробную операцию или восстановиться после ошибки. | ||
+ | |||
+ | Для отката необходимо чтобы объект-Хозяин предоставил объект-Хранитель для записи контрольной точки состояния Хозяина. Только Хозяину разрешено записывать и считывать информацию из Хранителя. | ||
+ | |||
+ | Впоследствии Хозяин может восстановить своё состояние по информации, записанной в Хранителе. | ||
+ | |||
+ | === Реализация === | ||
+ | ==== Диаграмма классов ==== | ||
+ | [[Изображение:MementoCommon.png]] | ||
+ | |||
+ | ==== Участники==== | ||
+ | * '''Memento''' (Хранитель) | ||
+ | ** Сохраняет внутреннее состояние объекта Originator (Хозяин). | ||
+ | ** Запрещает доступ к своему содержимому всем объектам кроме Хозяина. | ||
+ | ** У Хранителя - два интерфейса - для Хозяина (сохранение и восстановление состояния) и для остальных - только ссылка на Хранителя как единое целое. | ||
+ | * '''Originator''' (Хозяин) | ||
+ | ** Создает Хранитель, содержащий снимок текущего состояния | ||
+ | ** Использует Хранитель для восстановления состояния | ||
+ | * '''Caretaker''' (Посыльный) | ||
+ | ** Хранит переменную Хранителя и не производит над ним никаких других операций | ||
=== Пример === | === Пример === | ||
+ | <source lang="Csharp">class Originator | ||
+ | { | ||
+ | public string State // Состояние, сохраняемое в Хранителе | ||
+ | { | ||
+ | get; set; | ||
+ | } | ||
− | + | public Memento CreateMemento() | |
− | + | { | |
+ | return new Memento(State); | ||
+ | } | ||
− | = | + | public void SetMemento(Memento memento) |
− | + | { | |
+ | State = memento.State; | ||
+ | } | ||
+ | } | ||
− | + | class Memento | |
− | + | { | |
+ | public Memento(string state) | ||
+ | { | ||
+ | this.State = state; | ||
+ | } | ||
− | + | public string State | |
− | + | { | |
+ | get; | ||
+ | private set; | ||
+ | } | ||
+ | } | ||
− | + | class Caretaker | |
− | + | { | |
− | + | public Memento Memento | |
+ | { | ||
+ | get; set; | ||
+ | } | ||
+ | }</source> | ||
− | * | + | === Достоинства и недостатки === |
+ | * Позволяет избежать раскрытия информации о внутреннем устройстве Хозяина | ||
+ | * Возможные издержки на копирование большого объема информации при сохранении | ||
+ | * В некоторых языках сложно организовать наличие широкого и узкого интерфейса к хранителю | ||
+ | * Посыльный отвечает за хранение Хранителя, но не знает, сколько памяти в нем хранится, что может приводить к неоправданным расходам памяти | ||
− | === | + | === Варианты === |
− | |||
− | |||
* | * |
Текущая версия на 11:29, 11 ноября 2014
Назначение
Хранитель - это объект, в котором сохраняется состояние другого объекта - хозяина хранителя. Это необходимо для того чтобы хозяин мог записать в хранитель некоторую контрольную точку - своё текущее состояние, а потом вернуться к этому состоянию.
Описание
Сохранение внутреннего состояния необходимо для механизмов отката и позволяет пользователю отменить пробную операцию или восстановиться после ошибки.
Для отката необходимо чтобы объект-Хозяин предоставил объект-Хранитель для записи контрольной точки состояния Хозяина. Только Хозяину разрешено записывать и считывать информацию из Хранителя.
Впоследствии Хозяин может восстановить своё состояние по информации, записанной в Хранителе.
Реализация
Диаграмма классов
Участники
- Memento (Хранитель)
- Сохраняет внутреннее состояние объекта Originator (Хозяин).
- Запрещает доступ к своему содержимому всем объектам кроме Хозяина.
- У Хранителя - два интерфейса - для Хозяина (сохранение и восстановление состояния) и для остальных - только ссылка на Хранителя как единое целое.
- Originator (Хозяин)
- Создает Хранитель, содержащий снимок текущего состояния
- Использует Хранитель для восстановления состояния
- Caretaker (Посыльный)
- Хранит переменную Хранителя и не производит над ним никаких других операций
Пример
class Originator
{
public string State // Состояние, сохраняемое в Хранителе
{
get; set;
}
public Memento CreateMemento()
{
return new Memento(State);
}
public void SetMemento(Memento memento)
{
State = memento.State;
}
}
class Memento
{
public Memento(string state)
{
this.State = state;
}
public string State
{
get;
private set;
}
}
class Caretaker
{
public Memento Memento
{
get; set;
}
}
Достоинства и недостатки
- Позволяет избежать раскрытия информации о внутреннем устройстве Хозяина
- Возможные издержки на копирование большого объема информации при сохранении
- В некоторых языках сложно организовать наличие широкого и узкого интерфейса к хранителю
- Посыльный отвечает за хранение Хранителя, но не знает, сколько памяти в нем хранится, что может приводить к неоправданным расходам памяти