Хранитель (Memento) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Пример)
(Пример)
Строка 27: Строка 27:
  
 
=== Пример ===
 
=== Пример ===
class Originator
+
<source lang="Csharp">class Originator
 
{
 
{
 
     string state;
 
     string state;
Строка 77: Строка 77:
 
         get { return memento; }
 
         get { return memento; }
 
     }
 
     }
}
+
}</source>
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===

Версия 10:34, 21 июля 2014

К основной странице курса

Назначение

Хранитель - это объект, в котором сохраняется состояние другого объекта - хозяина хранителя. Это необходимо для того чтобы хозяин мог записать в хранитель некоторую контрольную точку - своё текущее состояние, а потом вернуться к этому состоянию.

Описание

Сохранение внутреннего состояния необходимо для механизмов отката и позволяет пользователю отменить пробную операцию или восстановиться после ошибки.

Для отката необходимо чтобы объект-Хозяин предоставил объект-Хранитель для записи контрольной точки состояния Хозяина. Только Хозяину разрешено записывать и считывать информацию из Хранителя.

Впоследствии Хозяин может восстановить своё состояние по информации, записанной в Хранителе.

Реализация

Диаграмма классов

MementoCommon.png

Участники

  • 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; }
    }
}

Достоинства и недостатки

  • Позволяет избежать раскрытия информации о внутреннем устройстве Хозяина
  • Возможные издержки на копирование большого объема информации при сохранении
  • В некоторых языках сложно организовать наличие широкого и узкого интерфейса к хранителю
  • Посыльный отвечает за хранение Хранителя, но не знает, сколько памяти в нем хранится, что может приводить к неоправданным расходам памяти

Варианты