Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як патерн Command сприяє реалізації функціоналу undo/redo?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Патерн **Command (Команда)** ідеально підходить для реалізації **undo/redo**, тому що **кожна дія зберігається як об'єкт**, який знає, *що було зроблено* і *як це скасувати*. **Ключове:** не потрібно писати окрему логіку відкату - вона вбудована в команду, а багаторівневий undo/redo реалізується через стек.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняПатерн **Command (Команда)** ідеально підходить для реалізації **undo/redo**, тому що **кожна дія зберігається як об'єкт**, який знає, *що було зроблено* і *як це скасувати*. --- ### 1. **Команда інкапсулює операцію та її обернену дію** Кожен об'єкт-команда реалізує два методи: - `execute()` - виконує дію, - `undo()` - скасовує її (відновлює попередній стан). > Кожна команда знає, *що змінити* і *як повернути назад*. --- ### 2. **Зберігання історії команд** Після виконання команда додається в **стек історії**: ```java Stack<Command> history = new Stack<>(); command.execute(); history.push(command); ``` Коли потрібно скасувати останню дію: ```java if (!history.isEmpty()) history.pop().undo(); ``` А для `redo` можна зберігати видалені команди в окремому стеку і повторно викликати `execute()`. --- ### 3. **Приклад (Java)** ```java interface Command { void execute(); void undo(); } class TextEditor { private StringBuilder text = new StringBuilder(); void write(String s) { text.append(s); } void delete(int count) { text.delete(text.length() - count, text.length()); } String getText() { return text.toString(); } } class WriteCommand implements Command { private TextEditor editor; private String text; public WriteCommand(TextEditor editor, String text) { this.editor = editor; this.text = text; } public void execute() { editor.write(text); } public void undo() { editor.delete(text.length()); } } ``` **Використання:** ```java TextEditor editor = new TextEditor(); Command cmd = new WriteCommand(editor, "Привіт"); cmd.execute(); cmd.undo(); ``` --- ### 4. **Як це працює** 1. Кожна команда зберігає дані, потрібні для скасування. 2. Після виконання команда записується в історію. 3. При `undo()` викликається метод `undo()`. 4. При `redo()` - знову `execute()`. --- ### 5. **Переваги** - Не потрібно писати окрему логіку відкату - вона вбудована в команду. - Можна робити **багаторівневий undo/redo** через стек. - Код клієнта не знає, як саме виконується або скасовується дія. --- **Підсумок:** Патерн **Command** робить `undo/redo` можливим, тому що кожна операція існує як **об'єкт з власною історією**, який уміє **сам себе виконати і скасувати**, створюючи гнучку і керовану систему дій.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.