Паттерн "Мементо" в Java — снимки состояния и undo
Модель и масштаб — Основы БД, опорные темы, проектирование БД, пакетная работа. Карта — о разделе.
Обзор — в поведенческих паттернах. Здесь — Memento на Java: сохранить снимок состояния объекта и откатиться, не открывая внутренние поля посторонним классам.
Play ITЗагрузка интерактивного демо…
Задача паттерна
Memento фиксирует полное состояние объекта в отдельной структуре (снимок), чтобы позже восстановить его. Аналогия — Ctrl+Z в редакторе: где-то лежит копия прошлого состояния.
Три роли:
| Роль | Пример |
|---|---|
| Originator | ServerConfig — создаёт и принимает снимок |
| Memento | ConfigMemento — неизменяемые данные снимка |
| Caretaker | ConfigHistory — стек снимков, без доступа к деталям |
Пример — конфигурация сервера
Код ITЗагрузка примера кода…
Код ITЗагрузка примера кода…
record с компактным конструктором даёт защитную копию Map — caretaker не сможет случайно изменить снимок снаружи.
Memento и Command
| Memento | Command | |
|---|---|---|
| Хранит | Снимок состояния | Описание действия |
| Откат | restore(memento) | undo() инвертирует операцию |
| Когда лучше | Нужна точная копия всего состояния | Нужны лог, очередь, сериализация команд |
Практика Command на Java — Паттерн "Команда" в Java — undo в редакторе и очередь действий, на C# — Паттерн "Команда" в C# — объекты действий, а не методы.
Когда применять и риски
Уместен для undo, checkpoint, черновиков, игровых сейвов.
Риск — память: частые снимки больших объектов. Ограничивайте глубину стека, храните дельты или сжимайте историю.