TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1675 2.37K
Паттерн проектирования Memento

🔸Сценарий: создание текстового редактора

Вы пишете текстовый редактор и вам нужна функциональность undo/redo.
Пользователь вводит, удаляет, форматирует текст и ожидает возможность откатить изменения к предыдущему состоянию.

// Пользователь ввёл: "Hello"
// Пользователь ввёл: " World"
// Пользователь удалил: "World"
// Пользователь хочет откатить → восстановить "World"
// Пользователь хочет откатить снова → восстановить "Hello"


Без Memento пришлось бы вручную отслеживать каждое изменение и разрабатывать логику обратного отката для каждого действия.

🔸Проблемы без Memento

- Доступ к внутренним полям - нужно лезть в приватные данные объекта для сохранения/восстановления состояния
- Сложная логика отката - откат каждого типа операций приходится писать вручную
- Сильная связка - логика undo перемешана с бизнес-логикой
- Прожорливость памяти - хранение целых объектов вместо снапшотов

🔸Как помогает Memento

Паттерн Memento говорит

> «Позволь объектам сохранять и восстанавливать своё состояние через снапшоты, не раскрывая внутренние детали».


Flow

1. Создать снимок состояния
2. Сохранить в Caretaker
3. Продолжить работу
4. Запросить откат
5. Восстановить состояние

🔸Три ключевых компонента

- Originator - объект, чьё состояние нужно сохранить (например, документ)
- Memento - снимок состояния в определённый момент времени
- Caretaker - управляет снапшотами, но не может их изменять

🔸Когда использовать Memento

- Undo/Redo в редакторах, играх, формах
- Транзакционный откат в базах данных или операциях
- Чекпоинты в долгих процессах
- История состояния для отладки или аудита

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

- Сохранение инкапсуляции - внутреннее состояние остаётся приватным
- Чистое разделение - логика отката отделена от бизнес-логики
- Гибкие снапшоты - сохраняется только то, что нужно
- Простота внедрения - стандартный и понятный паттерн

🔸Примеры

- Текстовые редакторы - Ctrl+Z с сохранением состояния документа
- Фоторедакторы - панель истории шагов редактирования
- Игры - сохранения и чекпоинты
- Транзакции в БД - откат при сбое

🔸Недостатки

- Память - хранение множества снапшотов
- Производительность - создание снапшотов требует времени
- Сложность для больших объектов - глубокое копирование может быть дорогим

👉 Java Portal
  • 🔥 8
  • ❤ 6
  • 👍 2
More from @java_iibrary
  1. Sep 30, 2026Docker прост, пока всё работает. Но что делать, если контейнер постоянно перезапускается,…
  2. Sep 29, 2026Эволюция языков программирования 1940-е → Машинный код ⬇️ 1950-е → Ассемблер ⬇️ 1960-е → F…
  3. Sep 29, 2026Большинство Java-разработчиков используют эти термины каждый день. Удивительно, но многие…
  4. Sep 28, 2026💡 Java: не создавайте ресурсоёмкие объекты, пока они действительно не понадобятся. ✅ Иниц…
  5. Sep 28, 2026Проблема в продакшене. Приложение зависло. Вы запускаете: jstack <pid> Через несколько сек…
  6. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →