/
expens1ve
/
project_war
Обзор
Документация
Войти
/
expens1ve
/
project_war
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
solid
UI/Commands/CommandInvoker.cs
73 строки
2 KB
Vadim
add command, undo, redo
20 май 2026, 01:42
20 май 2026, 01:42
27e173e
Код
Авторство
О чём код?
using System.Collections.Generic; using project_war.UI.Interfaces; namespace project_war.UI.Commands { /// <summary> /// Invoker (Инициатор) в паттерне Command. /// Хранит историю отменяемых команд и управляет стеками Undo/Redo. /// </summary> public class CommandInvoker { private readonly Stack<IUndoableCommand> _undoStack = new(); private readonly Stack<IUndoableCommand> _redoStack = new(); public bool CanUndo => _undoStack.Count > 0; /// <summary> /// Выполняет команду. Если команда отменяемая, она сохраняется в истории. /// </summary> public void ExecuteCommand(ICommand command) { command.Execute(); if (command is IUndoableCommand undoable) { _undoStack.Push(undoable); _redoStack.Clear(); // При новом действии ветка Redo сбрасывается } } /// <summary> /// Отменяет последнюю команду. /// </summary> public void Undo() { if (_undoStack.Count > 0) { var command = _undoStack.Pop(); command.Undo(); _redoStack.Push(command); } else { System.Console.WriteLine("Нет доступных действий для отмены."); Pause(); } } /// <summary> /// Повторяет последнюю отмененную команду. /// </summary> public void Redo() { if (_redoStack.Count > 0) { var command = _redoStack.Pop(); command.Redo(); _undoStack.Push(command); } else { System.Console.WriteLine("Нет доступных действий для повтора."); Pause(); } } private static void Pause() { System.Console.WriteLine("Нажмите любую клавишу, чтобы продолжить..."); System.Console.ReadKey(intercept: true); } } }