Які три ролі беруть участь у Memento?
У патерні Memento (Знімок) беруть участь три ключові ролі, кожна з яких відповідає за свій аспект збереження і відновлення стану:
1. Originator (Створювач)
Об'єкт, чий стан потрібно зберегти і пізніше відновити. Він сам знає, які дані важливо зафіксувати, і може:
- створити знімок (
createMemento()), - відновитися з нього (
restore(memento)).
Приклад:
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 m) { text = m.getState(); }
}Створювач - власник стану і єдиний, хто знає його структуру.
2. Memento (Знімок)
Об'єкт, який зберігає стан Створювача у певний момент часу. Його внутрішній устрій закритий від інших об'єктів - ніхто, крім Originator, не може змінювати чи читати стан.
Приклад:
class Memento {
private final String state;
public Memento(String state) { this.state = state; }
public String getState() { return state; }
}Знімок - інкапсульований контейнер стану.
3. Caretaker (Опікун)
Об'єкт, який керує історією знімків, але не знає, що всередині них. Він зберігає, вилучає і передає знімки назад Створювачу за потреби.
Приклад:
class History {
private Stack<Memento> history = new Stack<>();
public void push(Memento m) { history.push(m); }
public Memento pop() { return history.pop(); }
}Caretaker відповідає за життєвий цикл знімків, але не втручається в їхній вміст.
Коротко
| Роль | Відповідальність |
|---|---|
| Originator | Створює і відновлює свій стан |
| Memento | Зберігає стан, не розкриваючи деталей реалізації |
| Caretaker | Зберігає і керує знімками, не знаючи їхнього вмісту |
Підсумок
Патерн Memento розподіляє обов'язки так, щоб:
- Originator відповідав за дані,
- Memento за безпечне зберігання,
- Caretaker за контроль історії, зберігаючи при цьому інкапсуляцію і незалежність компонентів.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.