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