Skip to content

Momento

Pandas edited this page Jun 19, 2017 · 1 revision

Назначение

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

Применимость

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

Структура

Imgur

Участники

  • Memento - хранитель: сохраняет внутреннее состояние объекта Originator. Объем сохраняемой информации может быть различным и определяется потребностями хозяина; запрещает доступ всем другим объектам, кроме хозяина.
  • Originator - хозяин: создает хранитель, содержащего снимок текущего внутреннего состояния; использует хранитель для восстановления внутреннего состояния;
  • Caretaker - посыльный: отвечает за сохранение хранителя; не производит никаких операций над хранителем и не исследует его внутреннее содержимое.

Отношения

  • посыльный запрашивает хранитель у хозяина, некоторое время держит его у себя, а затем возвращает хозяину, как видно на представленной диаграмме взаимодействий.Иногда этого не происходит, так как последнему не нужно восстанавливать прежнее состояние;
  • хранители пассивны. Только хозяин, создавший хранитель, имеет доступ к информации о состоянии.

Результаты

Характерные особенности паттерна хранитель:

  • Сохранение границ инкапсуляции.
  • Упрощение структуры хозяина.
  • Значительные издержки при использовании хранителей. С хранителями могут быть связаны заметные издержки, если хозяин должен копировать большой объем информации для занесения в память хранителя или если клиенты создают и возвращают хранителей достаточно часто.
  • Скрытая плата за содержание хранителя. Посыльный отвечает за удаление хранителя, однако не располагает информацией о том, какой объем информации о состоянии скрыт в нем.
Clone this wiki locally