Статьи

Учебник по Memento Pattern с примерами на Java

Сегодняшний шаблон — это шаблон Memento, который используется в средах отмены, чтобы вернуть объект в предыдущее состояние.

Памятка в реальном мире 

В реальном мире сувениры используются как напоминание или ссылка на то, как что-то должно выглядеть. Например, если вы решите разобрать телефон, чтобы заменить внутреннюю часть, у вас может быть доступный идентичный телефон, который вы будете использовать в качестве справочного, гарантируя, что вы можете вернуть телефон в исходное состояние.

Refcard Designs Patterns
Для лучшего обзора самых популярных шаблонов дизайна, лучше всего начать с Refcard Designs Patterns от DZone

Образец Памяти

Шаблон Memento известен как поведенческий шаблон, так как он используется для управления алгоритмами, отношениями и обязанностями между объектами. Определение Memento, представленное в оригинальной книге «Банды четырех» на DesignPatterns, гласит: 

Захватывает и экстернализует внутреннее состояние объекта, чтобы впоследствии его можно было восстановить без нарушения инкапсуляции.

Следующая диаграмма показывает, как моделируется образец сувенира.

Давайте посмотрим на каждого из участников этого паттерна. Оригинатор является объектом , который знает , как спасти себя: класс , который вы хотите сделать с сохранением состояния. Сторож в том , что объект , который имеет дело с , когда и почему Возбудитель необходимо сохранить или восстановить себя. Memento содержит информацию о состоянии оригинатора, и не может быть изменен смотрителем.

Поток событий таков, что смотритель запрашивает у инициатора объект Memento и выполняет любые необходимые ему действия. Чтобы откатить состояние перед этими действиями, он возвращает объект памятки отправителю. 

Когда я буду использовать этот шаблон?

Шаблон Memento полезен, когда вам нужно предоставить механизм отмены в ваших приложениях, когда внутреннее состояние объекта может потребоваться восстановить на более позднем этапе. Используя сериализацию вместе с этим шаблоном, легко сохранить состояние объекта и вернуть его позже.

Так как это работает в Java?

Давайте проиллюстрируем этот шаблон на простом примере в Java. Поскольку этот шаблон используется для фреймворков отмены, мы будем моделировать редактор. 

Во-первых, память должна иметь возможность сохранять содержимое редактора, которое будет просто текстом: 

//Memento
public class EditorMemento {
  private final String editorState;
  public EditorMemento(String state) {
    editorState = state;
  }
  public String getSavedState() {
    return editorState;
  }
}

 

Теперь наш класс Originator, редактор, может использовать память:

//Originator
public class Editor {
  //state
  public String editorContents;
  public void setState(String contents) {
    this.editorContents = contents;
  }
  public EditorMemento save() {
    return new EditorMemento(editorContents);
  }
  public void restoreToState(EditorMemento memento) {
    editorContents = memento.getSavedState();
  }
}

Каждый раз, когда мы хотим сохранить состояние, мы вызываем метод save (), а отмена вызывает метод restoreToState.
Затем наш смотритель может отследить все сувениры в стеке, чтобы сработала структура отмены.

Остерегайтесь недостатков

Некоторые проблемы с этим шаблоном состоят в том, что сохранение или восстановление состояния может занимать много времени. При неправильном использовании он может раскрыть внутреннюю структуру вашего объекта, что позволяет любому другому объекту изменять состояние вашего объекта.

Следующий

Когда мы начнем ближе к концу серии, мы посмотрим на паттерн «Посредник».

Наслаждайтесь всей серией «Design Patterns Uncovered»:

Образцы творчества

Структурные паттерны

Поведенческие образцы