/
puma
/
ppa
Обзор
Документация
Войти
/
puma
/
ppa
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Commands/CommandInvoker.cs
57 строк
2 KB
Margarita
new
29 май 2026, 17:05
29 май 2026, 17:05
cc969a9
Код
Авторство
О чём код?
using System.Collections.Generic; /// <summary> /// Инвокер (паттерн Command): хранит историю команд и управляет Undo/Redo. /// При выполнении новой команды очищает стек Redo — нельзя «повторить» /// действие, если после отмены было сделано новое. /// </summary> public class CommandInvoker { private readonly Stack<IGameCommand> _undoStack = new(); private readonly Stack<IGameCommand> _redoStack = new(); /// <summary>Есть ли команды для отмены.</summary> public bool CanUndo => _undoStack.Count > 0; /// <summary>Есть ли команды для повтора.</summary> public bool CanRedo => _redoStack.Count > 0; /// <summary> /// Выполнить команду. Если команда поддерживает отмену — помещает её в стек Undo /// и очищает стек Redo. /// </summary> public void Execute(IGameCommand command) { command.Execute(); if (command.CanUndo) { _undoStack.Push(command); _redoStack.Clear(); } } /// <summary> /// Отменить последнее действие: извлекает команду из стека Undo, /// вызывает Undo() и перекладывает в стек Redo. /// </summary> public void Undo() { if (!CanUndo) return; var cmd = _undoStack.Pop(); cmd.Undo(); _redoStack.Push(cmd); } /// <summary> /// Повторить отменённое действие: извлекает команду из стека Redo, /// выполняет её заново и возвращает в стек Undo. /// </summary> public IGameCommand? Redo() { if (!CanRedo) return null; var cmd = _redoStack.Pop(); cmd.Execute(); _undoStack.Push(cmd); return cmd; } }