🧭 Command - EmilioCrespoPeran/pattern-designs GitHub Wiki

📚 Descripción del patrón

El patrón Command es un patrón de diseño de comportamiento que encapsula una solicitud como un objeto, lo que permite parametrizar clientes con diferentes solicitudes, encolar o registrar solicitudes, y soportar operaciones que se pueden deshacer.

Este patrón desacopla al emisor de una acción (por ejemplo, un control remoto, una UI o un sistema de eventos) del receptor real que ejecuta esa acción (por ejemplo, una luz, una máquina de café, un aire acondicionado), delegando la operación a un objeto comando.

Cada comando implementa una interfaz común (por ejemplo, Comando) y contiene toda la lógica necesaria para ejecutar una acción específica, y opcionalmente, revertirla (mediante un método deshacer()).

🛠️ Beneficios clave

  • Desacoplamiento entre el emisor y el receptor de las operaciones.
  • Permite implementar colas de comandos, historiales, y funcionalidades de deshacer/rehacer.
  • Facilita la extensión y configuración dinámica de comandos (por ejemplo, asociar comandos a botones).
  • Se puede combinar con otros patrones como Memento para lograr deshacer más avanzado (guardando estados).

🧪 Posibilidades que habilita

  • Ejecutar comandos en orden o condicionalmente.
  • Registrar las operaciones del usuario y revertirlas.
  • Soportar funcionalidades tipo macro comandos (ejecutar múltiples comandos encadenados).
  • Crear aplicaciones reactivas, controladas por scripts, o menús configurables.

🧩 Enunciado del ejercicio – Control Remoto Programable

Descripción del escenario Vas a construir un sistema para un control remoto inteligente que puede controlar distintos dispositivos electrónicos (como luces, aire acondicionado, altavoces, etc.) a través de comandos configurables.

El control remoto tiene varios botones programables, y cada botón puede ser asociado a un comando que representa una acción concreta (encender luz, apagar luz, subir volumen, etc.).

📌 Requisitos funcionales

  1. Comandos encapsulados:

    • Cada acción (como encender una luz) debe implementarse como una clase comando que implemente una interfaz común Comando.
  2. Interfaz Comando:

public interface Comando {
    String ejecutar();
    String deshacer();
}
  1. Dispositivos:

    • Define al menos dos clases de dispositivos:
      • Luz: con métodos encender() y apagar().
      • AireAcondicionado: con métodos encender(), apagar(), subirTemperatura() y bajarTemperatura().
  2. Comandos concretos:

    • Implementa al menos cinco comandos concretos que encapsulen operaciones sobre los dispositivos.
      • Ej: ComandoEncenderLuz, ComandoApagarLuz, ComandoSubirTemperaturaAire, etc.
  3. Control remoto:

    • Clase ControlRemoto con una lista de botones programables (Map<Integer, Comando>).
    • Permite asignar comandos a botones y ejecutar el comando de un botón.
  4. Flexibilidad:

    • Los botones pueden ser reprogramados en tiempo de ejecución.
  5. Undo():

    • El método undo() permite revertir la acción ejecutada previamente. Para ello, cada comando debe saber cómo revertir lo que hizo con ejecutar().
  6. Asegúrate de tener:

    • La clase ControlRemoto con métodos asignarComando(int, Comando), presionarBoton(int), y removerComando(int).
    • Las clases Luz, AireAcondicionado con métodos adecuados y estados internos (boolean encendida, int temperatura).
    • Las implementaciones de Comando para cada acción.

🧪 Test

Los tests para este ejercicio los puedes encontrar en src/test/java/es/cresdev/patterns/command/controlremoto/CommandControlRemotoTests.java