Skip to main content

Що робить патерн Memento?

Патерн Memento (Знімок) призначений для збереження і відновлення стану об'єкта без порушення його інкапсуляції.


1. Суть ідеї

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

Простіше кажучи: Memento - це "Ctrl+Z" для об'єктів.


2. Ролі, що беруть участь

  • Originator (Створювач) - об'єкт, чий стан потрібно зберегти. Він створює знімок і може відновитися з нього.
  • Memento (Знімок) - об'єкт, який зберігає збережений стан. Його внутрішній устрій прихований від зовнішнього світу.
  • Caretaker (Опікун) - зовнішній об'єкт, який зберігає знімки, але не має доступу до їхнього вмісту (наприклад, історія дій).

3. Приклад (Java)

java
// Знімок class Memento { private final String state; public Memento(String state) { this.state = state; } public String getState() { return state; } } // Створювач 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(); } } // Опікун class History { private Stack<Memento> history = new Stack<>(); public void push(Memento m) { history.push(m); } public Memento pop() { return history.pop(); } }

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

java
Editor editor = new Editor(); History history = new History(); editor.setText("Версія 1"); history.push(editor.save()); editor.setText("Версія 2"); editor.restore(history.pop()); // відкат до "Версія 1"

4. Переваги

  • Дозволяє реалізувати undo/redo без порушення інкапсуляції.
  • Розділяє відповідальність: об'єкт зберігає логіку, опікун - історію.
  • Безпечно зберігає внутрішні стани (інші об'єкти не бачать деталей).

5. Недоліки

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

Висновок

Патерн Memento потрібен, щоб:

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

Підсумок:

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

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

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

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