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