Command

Encapsula una solicitud como un objeto, permitiendo parametrizar, encolar, registrar y deshacer.

Contexto

Necesitas hacer undo/redo, encolar tareas, ejecutar offline o auditar acciones del usuario.

Problema

Un método directo no se puede revertir, registrar ni encolar.

Solución

Cada acción se vuelve un objeto ICommand con Execute() y opcionalmente Undo().

#Ejemplo en C#

public interface ICommand { void Execute(); void Undo(); }

public class AddTextCommand : ICommand
{
    private readonly Document _doc; private readonly string _text;
    public AddTextCommand(Document d, string t) { _doc = d; _text = t; }
    public void Execute() => _doc.Append(_text);
    public void Undo()    => _doc.RemoveLast(_text.Length);
}

public class CommandHistory
{
    private readonly Stack<ICommand> _stack = new();
    public void Run(ICommand c) { c.Execute(); _stack.Push(c); }
    public void Undo()          { if (_stack.TryPop(out var c)) c.Undo(); }
}
Cuándo NO aplicarlo

Cuando no necesitas undo/queue/log: añade boilerplate sin valor.

Tradeoffs
Pro Contra
Habilita undo, queue, audit, replay Una clase por acción
Desacopla emisor y receptor Más memoria si guardas histórico

#behavioral #gof #undo