Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як зберігати історію змін за допомогою Memento?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Історію змін за допомогою **Memento (Знімок)** зберігають, створюючи **послідовність знімків стану об'єкта (Originator)** і поміщаючи їх у структуру даних, зазвичай **стек** або **список**. **Ключове:** Memento перетворює історію змін на послідовність "знімків часу", дозволяючи безпечно відкочуватися назад, не порушуючи інкапсуляцію об'єкта.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняІсторію змін за допомогою **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 перетворює історію змін на послідовність "знімків часу", > дозволяючи безпечно відкочуватися назад, не порушуючи інкапсуляцію об'єкта.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.