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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Достоинства и недостатки)
(Пример)
Строка 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

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

Назначение

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

Описание

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

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

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

Реализация

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

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

}

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

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

Варианты