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