Skip to main content

У чому відмінність Memento від Command при реалізації відкату?

Патерни Memento і Command обидва дозволяють реалізувати відкат дій (undo), але роблять це різними способами і на різних рівнях - один працює зі станом, інший - з діями.


1. Основна різниця по суті

КритерійMementoCommand
Що зберігаєСтан об'єктаДію, яка змінює стан
Як відкочуєВідновлює збережений станВиконує "обернену дію"
Коли використовуєтьсяКоли потрібно повернути об'єкт "як було"Коли потрібно скасувати конкретну дію
Тип відкатуЗнімок (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

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