Skip to main content

Як зберігати історію змін за допомогою Memento?

Історію змін за допомогою Memento (Знімок) зберігають, створюючи послідовність знімків стану об'єкта (Originator) і поміщаючи їх у структуру даних, зазвичай стек або список. Кожен знімок фіксує стан об'єкта у певний момент, а за потреби можна відкотитися назад, відновивши один з минулих станів.


1. Загальна структура

Три ролі:

  • Originator - створює знімок і відновлюється з нього;
  • Memento - зберігає стан (зазвичай immutable);
  • Caretaker - керує історією (зберігає, повертає знімки).

2. Приклад реалізації (Java)

Memento (знімок стану)

java
class Memento { private final String state; public Memento(String state) { this.state = state; } public String getState() { return state; } }

Originator (об'єкт, чий стан зберігається)

java
class Editor { private String text; public void setText(String text) { this.text = text; } public String getText() { return text; } // Створює знімок public Memento save() { return new Memento(text); } // Відновлює стан зі знімка public void restore(Memento memento) { text = memento.getState(); } }

Caretaker (керує історією знімків)

java
class History { private Stack<Memento> history = new Stack<>(); public void saveState(Memento memento) { history.push(memento); } public Memento undo() { if (!history.isEmpty()) return history.pop(); return null; } }

Використання

java
Editor editor = new Editor(); History history = new History(); editor.setText("Версія 1"); history.saveState(editor.save()); editor.setText("Версія 2"); history.saveState(editor.save()); editor.setText("Версія 3"); System.out.println(editor.getText()); // → Версія 3 editor.restore(history.undo()); System.out.println(editor.getText()); // → Версія 2 editor.restore(history.undo()); System.out.println(editor.getText()); // → Версія 1

3. Як це працює

  1. Після кожної зміни об'єкт створює знімок (через save()), і Caretaker додає його в стек.
  2. За потреби відкату Caretaker повертає останній знімок, а Originator відновлює свій стан (restore(memento)).
  3. Таким чином створюється історія змін, аналог undo/redo.

4. Розширення: redo і обмеження історії

  • Для redo можна зберігати другий стек, у який поміщаються скасовані знімки.
  • Щоб уникнути переповнення пам'яті, можна обмежувати довжину історії, видаляючи старі записи.

5. Переваги

  • Історія зберігається без порушення інкапсуляції об'єкта.
  • Можна "відмотати" стан на будь-який крок назад.
  • Проста і безпечна реалізація undo/redo.

Висновок

Зберігання історії за допомогою Memento зводиться до трьох кроків:

  1. Після кожної зміни - створити знімок стану.
  2. Зберегти знімок у стек (Caretaker).
  3. При відкаті - відновити стан з останнього знімка.

Підсумок:

Memento перетворює історію змін на послідовність "знімків часу", дозволяючи безпечно відкочуватися назад, не порушуючи інкапсуляцію об'єкта.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.