Skip to main content

Які три ролі беруть участь у Memento?

У патерні Memento (Знімок) беруть участь три ключові ролі, кожна з яких відповідає за свій аспект збереження і відновлення стану:


1. Originator (Створювач)

Об'єкт, чий стан потрібно зберегти і пізніше відновити. Він сам знає, які дані важливо зафіксувати, і може:

  • створити знімок (createMemento()),
  • відновитися з нього (restore(memento)).

Приклад:

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 m) { text = m.getState(); } }

Створювач - власник стану і єдиний, хто знає його структуру.


2. Memento (Знімок)

Об'єкт, який зберігає стан Створювача у певний момент часу. Його внутрішній устрій закритий від інших об'єктів - ніхто, крім Originator, не може змінювати чи читати стан.

Приклад:

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

Знімок - інкапсульований контейнер стану.


3. Caretaker (Опікун)

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

Приклад:

java
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 за контроль історії, зберігаючи при цьому інкапсуляцію і незалежність компонентів.

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

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

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