У чому відмінність Memento від Command при реалізації відкату?
Патерни Memento і Command обидва дозволяють реалізувати відкат дій (undo), але роблять це різними способами і на різних рівнях - один працює зі станом, інший - з діями.
1. Основна різниця по суті
| Критерій | Memento | Command |
|---|---|---|
| Що зберігає | Стан об'єкта | Дію, яка змінює стан |
| Як відкочує | Відновлює збережений стан | Виконує "обернену дію" |
| Коли використовується | Коли потрібно повернути об'єкт "як було" | Коли потрібно скасувати конкретну дію |
| Тип відкату | Знімок (state-based) | Операція (operation-based) |
2. Механізм роботи
Memento
- При кожній зміні зберігається знімок стану об'єкта (наприклад, увесь текст у редакторі).
- Для відкату просто відновлюється минулий знімок.
- Об'єкт не знає, які саме операції призвели до цього стану.
Аналог: «Повернись на 2 кроки назад» - просто відновити стару версію файлу.
java
// Memento відкочує за станом
editor.restore(history.pop());Command
- Кожна дія (наприклад, "вирізати", "вставити", "видалити") оформлюється як команда, яка знає, як виконати і як скасувати себе.
- Для undo викликається
command.undo(), де описана обернена дія.
Аналог: «Скасуй останню операцію» - зроби протилежну дію.
java
command.execute(); // Виконати
command.undo(); // Відкотити3. Коли використовувати який
Memento
- Коли важливо відновити весь стан об'єкта.
- Коли неможливо або занадто складно описати "обернену дію".
- Приклад: текстовий редактор, збереження документа, знімки гри.
Command
- Коли є набір дій, кожну з яких можна "розгорнути назад".
- Коли важлива історія операцій, а не станів.
- Приклад: графічний редактор (видалити шар, змінити колір, перемістити).
4. Комбіноване використання
У складних системах обидва патерни часто використовуються разом:
Commandописує дію (наприклад, "замінити текст"),- а
Mementoзберігає стан, щоб команда знала, до чого повертатися.
Наприклад:
ReplaceTextCommandзберігає знімок тексту перед зміною (через Memento), а приundo()відновлює його.
Висновок
- Memento → "Відкат за станом" (повернутися до попередньої версії).
- Command → "Відкат за дією" (виконати протилежну дію).
Підсумок:
Memento зберігає що вийшло, Command пам'ятає що робилося.
У реальних системах Memento підходить для станів, Command - для логіки дій.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.