Перейти к основному содержимому

Паттерн "Мементо" в Java — снимки состояния и undo

Разработчику Архитектору
Теория данных (раздел 3)

Обзор — в поведенческих паттернах. Здесь — Memento на Java: сохранить снимок состояния объекта и откатиться, не открывая внутренние поля посторонним классам.

Play ITЗагрузка интерактивного демо…


Задача паттерна

Memento фиксирует полное состояние объекта в отдельной структуре (снимок), чтобы позже восстановить его. Аналогия — Ctrl+Z в редакторе: где-то лежит копия прошлого состояния.

Три роли:

РольПример
OriginatorServerConfig — создаёт и принимает снимок
MementoConfigMemento — неизменяемые данные снимка
CaretakerConfigHistory — стек снимков, без доступа к деталям

Пример — конфигурация сервера

Код ITЗагрузка примера кода…

Код ITЗагрузка примера кода…

record с компактным конструктором даёт защитную копию Map — caretaker не сможет случайно изменить снимок снаружи.


Memento и Command

MementoCommand
ХранитСнимок состоянияОписание действия
Откатrestore(memento)undo() инвертирует операцию
Когда лучшеНужна точная копия всего состоянияНужны лог, очередь, сериализация команд

Практика Command на Java — Паттерн "Команда" в Java — undo в редакторе и очередь действий, на C# — Паттерн "Команда" в C# — объекты действий, а не методы.


Когда применять и риски

Уместен для undo, checkpoint, черновиков, игровых сейвов.

Риск — память: частые снимки больших объектов. Ограничивайте глубину стека, храните дельты или сжимайте историю.


См. также