Що робить патерн 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.