# Propósito
El patrón Command (comando, orden) encapsula una petición en un objeto, permitiendo parametrizar métodos con diferentes solicitudes, retrasar o encolar ejecuciones y soportar deshacer.
En términos simples: creamos un objeto con la información necesaria para que un manejador (handler) realice la tarea.
# Problema
-
Acoplamiento: Cuando el emisor (ej. un botón) está ligado directamente a la lógica de negocio.
-
Reutilización: Dificultad para agregar nuevas solicitudes sin modificar clases existentes.
# Solución
-
Objetos de Comando: Encapsulación de toda la información necesaria para la acción.
-
Separación: Los emisores no conocen los detalles de ejecución.
# Estructura
# Participantes
- Command: Interfaz con el método execute().
- ConcreteCommand: Implementa Command e invoca al Receiver.
- Invoker: Mantiene referencia al comando y llama a execute().
- Receiver: Realiza el trabajo real (lógica de negocio).
- Client: Crea y configura comandos y receptores.
# Cuándo Usarlo
-
Parametrizar objetos según una acción a realizar.
-
Implementar operaciones de deshacer (undo) y rehacer (redo).
-
Mantener un historial de solicitudes.
# Ventajas
-
verified
Desacoplamiento: Aísla la invocación de la ejecución.
-
verified
Extensibilidad: Nuevos comandos sin cambiar código base.
-
verified
Flexibilidad: Soporta colas e historiales complejos.
# Desventajas
-
warning
Complejidad: Más clases y objetos en el sistema.
-
warning
Sobrecarga: Acciones simples convertidas en comandos.
# Ejemplo: Hogar Inteligente
Control de luces, termostatos y seguridad mediante una interfaz centralizada. Los comandos encapsulan las acciones de encendido/apagado.
# Código Java
interface Command { void execute(); }
class LightOnCommand implements Command {
private Light light;
public void execute() { light.turnOn(); }
}
class RemoteControl {
private Command command;
public void setCommand(Command c) { command = c; }
public void pressButton() { command.execute(); }
}
# Mapeo Participantes
- Command (Interfaz): El contrato execute().
- LightOn/Off (ConcreteCommand): Lógica específica.
- Light (Receiver): Lógica de negocio.
- RemoteControl (Invoker): Inicia la acción.
# Conclusiones
Facilita la extensión para incluir más dispositivos manteniendo un acoplamiento débil entre el emisor y el receptor.
# Patrones relacionados
Memento
Mantiene el estado previo para operaciones deshacer.
Composite
Estructuras compuestas para macro-comandos complejos.