🧭 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
-
Comandos encapsulados:
- Cada acción (como encender una luz) debe implementarse como una clase comando que implemente una interfaz común
Comando
.
- Cada acción (como encender una luz) debe implementarse como una clase comando que implemente una interfaz común
-
Interfaz
Comando
:
public interface Comando {
String ejecutar();
String deshacer();
}
-
Dispositivos:
- Define al menos dos clases de dispositivos:
Luz
: con métodosencender()
yapagar()
.AireAcondicionado
: con métodosencender()
,apagar()
,subirTemperatura()
ybajarTemperatura()
.
- Define al menos dos clases de dispositivos:
-
Comandos concretos:
- Implementa al menos cinco comandos concretos que encapsulen operaciones sobre los dispositivos.
- Ej:
ComandoEncenderLuz
,ComandoApagarLuz
,ComandoSubirTemperaturaAire
, etc.
- Ej:
- Implementa al menos cinco comandos concretos que encapsulen operaciones sobre los dispositivos.
-
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.
- Clase
-
Flexibilidad:
- Los botones pueden ser reprogramados en tiempo de ejecución.
-
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().
- El método
-
Asegúrate de tener:
- La clase
ControlRemoto
con métodosasignarComando(int, Comando)
,presionarBoton(int)
, yremoverComando(int)
. - Las clases
Luz
,AireAcondicionado
con métodos adecuados y estados internos (boolean encendida, int temperatura
). - Las implementaciones de
Comando
para cada acción.
- La clase
🧪 Test
Los tests para este ejercicio los puedes encontrar en src/test/java/es/cresdev/patterns/command/controlremoto/CommandControlRemotoTests.java