Patrón Command en C#: Guía Completa

Introducción: Acciones como objetos

Command encapsula una solicitud como objeto, permitiendo colas, logs, deshacer y macros. Al separar el invocador de la acción concreta, puedes cambiar o reordenar comandos sin tocar el emisor.

Este patrón es clave cuando necesitas historial de acciones, ejecución diferida o repetición de operaciones en distintos contextos.

Botón de control
Prompt: Modern control panel with buttons, minimal tech style.

1. Naturaleza: Señales y respuestas

Un estímulo (señal) provoca una acción. El estímulo es un "comando" que dispara una respuesta.

La señal no necesita conocer el detalle del movimiento; solo activa el mecanismo que sabe ejecutarlo, igual que un comando encapsula la acción.

Señal a respuesta
Prompt: Neuron firing signal, scientific illustration, clean style.

2. Mundo Real: Botones y macros

Un botón "Guardar" ejecuta una acción encapsulada. Una macro es una secuencia de comandos.

La interfaz no sabe cómo se guarda: solo dispara el comando. Esto permite reasignar acciones a los mismos botones sin cambiar la UI.

Macro de acciones
Prompt: UI macro sequence, arrows connecting buttons, flat infographic style.

3. Implementación en C#: Código Paso a Paso

public interface IComando { void Ejecutar(); }

public class Luz
{
    public void Encender() => Console.WriteLine("Luz encendida");
}

public class EncenderLuz : IComando
{
    private Luz _luz;
    public EncenderLuz(Luz luz) { _luz = luz; }
    public void Ejecutar() => _luz.Encender();
}

public class ControlRemoto
{
    private IComando _comando;
    public void SetComando(IComando comando) => _comando = comando;
    public void Presionar() => _comando.Ejecutar();
}

// Uso
var luz = new Luz();
var cmd = new EncenderLuz(luz);
var control = new ControlRemoto();
control.SetComando(cmd);
control.Presionar();

4. Command vs Strategy

Strategy selecciona algoritmos. Command encapsula acciones con posibilidad de historial.

Si necesitas deshacer, encolar o registrar acciones, Command es más adecuado; si solo cambias el algoritmo, Strategy es más simple.

5. Diagrama UML

UML Command
Prompt: UML diagram of Command pattern, clean vector layout.
Flujo comando
Prompt: Flow diagram showing invoker, command, receiver, minimal infographic.

⚠️ Cuándo NO Usar Command

  • Si no necesitas deshacer, colas ni historial.
  • Si las acciones son triviales y agregar objetos comando no aporta valor.

💪 Ejercicio

Crea comandos para reproducir, pausar y detener música, y una macro de "modo fiesta".

Conclusión

Command convierte acciones en objetos reutilizables y composables. Es ideal para interfaces, colas de trabajo y workflows con auditoría.