Паттерн проектирования "Хранитель" (Memento) позволяет сохранить и восстановить предшествующие состояния объекта без раскрытия деталей его реализации.
Основные роли:
- Исходный объект (Originator): Объект, состояние которого нужно сохранить. Создает объект-хранитель и использует его для восстановления своего состояния.
- Хранитель (Memento): Объект, который хранит состояние исходного объекта. Должен предоставлять минимально возможный интерфейс для доступа к хранимому состоянию, чтобы защитить его целостность.
- Опекун (Caretaker): Отвечает за хранение хранителей. Запрашивает хранитель у исходного объекта и передает его обратно исходному объекту для восстановления. Опекун не взаимодействует напрямую с содержимым хранителя.
Принцип работы:
- Исходный объект создает хранитель, содержащий снимок своего текущего состояния.
- Опекун сохраняет этот хранитель (например, в списке).
- Когда нужно восстановить состояние исходного объекта, опекун передает сохраненный хранитель обратно исходному объекту.
- Исходный объект восстанавливает свое состояние из данных, хранящихся в хранителе.
Преимущества:
- Сохранение инкапсуляции исходного объекта.
- Позволяет реализовать механизмы отмены (undo) и возврата (redo).
- Упрощает управление состояниями объекта.
Недостатки:
- Создание хранителей может быть затратным по памяти, особенно для больших объектов.
- Состояние хранителя может быть сложным для управления.
Пример реализации (упрощенный):
python