1 of 10

Memento

Хранитель

2 of 10

Пример

Вы несколько дней играете в невероятно сложную и интересную ролевую игру. Проходите последний уровень, видите финального босса, но вдруг...

3 of 10

В игре не было сохранений...

4 of 10

Хранитель за работой

Паттерн хранитель имеет 2 цели:

  • Сохранение важного состояния ключевого объекта
  • Должная инкапсуляция ключевого объекта

5 of 10

Реализация примера

6 of 10

Общая структура

7 of 10

Использование

  • Определите роли "смотрителя" и "хозяина".
  • Создайте класс Memento и объявите хозяина другом.
  • Смотритель знает, когда создавать "контрольную точку" хозяина.
  • Хозяин создает хранителя Memento и копирует свое состояние в этот Memento.
  • Смотритель сохраняет хранителя Memento (но смотритель не может заглянуть в Memento).
  • Смотритель знает, когда нужно "откатить" хозяина.
  • Хозяин восстанавливает себя, используя сохраненное в Memento состояние.

8 of 10

Преимущества

  • Упрощение структуры ключевого объекта
  • Инкапсуляция данных ключевого объекта
  • Простая реализация восстановления

9 of 10

Недостатки

  • Значительные издержки при использовании хранителей
  • Скрытая плата за содержание хранителя

10 of 10

Вывод

Используйте паттерн Хранитель, когда

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