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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Недостатки)
(Участники)
 
(не показано 25 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
[[Страница_курса_Паттерны_проектирования| К основной странице курса]]
 
[[Страница_курса_Паттерны_проектирования| К основной странице курса]]
 
__NOTOC__
 
__NOTOC__
 +
=== Назначение ===
 +
Хранитель - это объект, в котором сохраняется состояние другого объекта - хозяина хранителя. Это необходимо для того чтобы хозяин мог записать в хранитель некоторую контрольную точку - своё текущее состояние, а потом вернуться к этому состоянию.
 +
 
=== Описание ===
 
=== Описание ===
 +
Сохранение внутреннего состояния необходимо для механизмов отката и позволяет пользователю отменить пробную операцию или восстановиться после ошибки.
 +
 +
Для отката необходимо чтобы объект-Хозяин предоставил объект-Хранитель для записи контрольной точки состояния Хозяина. Только Хозяину разрешено записывать и считывать информацию из Хранителя.
 +
 +
Впоследствии Хозяин может восстановить своё состояние по информации, записанной в Хранителе.
 +
 +
=== Реализация ===
 +
==== Диаграмма классов ====
 +
[[Изображение:MementoCommon.png]]
  
=== Диаграмма классов ===
 
[[Изображение:.png|.png]]
 
 
==== Участники====
 
==== Участники====
*
+
* '''Memento''' (Хранитель)
 +
** Сохраняет внутреннее состояние объекта Originator (Хозяин).
 +
** Запрещает доступ к своему содержимому всем объектам кроме Хозяина.
 +
** У Хранителя - два интерфейса - для Хозяина (сохранение и восстановление состояния) и для остальных - только ссылка на Хранителя как единое целое.
 +
* '''Originator''' (Хозяин)
 +
** Создает Хранитель, содержащий снимок текущего состояния
 +
** Использует Хранитель для восстановления состояния
 +
* '''Caretaker''' (Посыльный)
 +
** Хранит переменную Хранителя и не производит над ним никаких других операций
  
=== Диаграмма последовательности ===
+
=== Пример ===
[[Изображение:.png]]
+
<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

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

Назначение

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

Описание

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

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

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

Реализация

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

MementoCommon.png

Участники

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

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

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

Варианты