El patrón Command encapsula una solicitud como un objeto, permitiendo la parametrización de los clientes con diferentes solicitudes, encolamiento de solicitudes y lograr la reversión de operaciones.
Ejemplo de Command en Java:
Supongamos que tienes una interfaz Comando
que define un método ejecutar()
:
// Interfaz Comando
interface Comando {
void ejecutar();
}
Luego, creas implementaciones concretas de Comando
, por ejemplo, ComandoEncender
y ComandoApagar
:
// ComandoEncender
class ComandoEncender implements Comando {
private Dispositivo dispositivo;
public ComandoEncender(Dispositivo dispositivo) {
this.dispositivo = dispositivo;
}
@Override
public void ejecutar() {
dispositivo.encender();
}
}
// ComandoApagar
class ComandoApagar implements Comando {
private Dispositivo dispositivo;
public ComandoApagar(Dispositivo dispositivo) {
this.dispositivo = dispositivo;
}
@Override
public void ejecutar() {
dispositivo.apagar();
}
}
Luego, tienes una clase Dispositivo
que tiene métodos encender()
y apagar()
:
// Clase Dispositivo
class Dispositivo {
public void encender() {
System.out.println("El dispositivo está encendido");
}
public void apagar() {
System.out.println("El dispositivo está apagado");
}
}
Ahora, tienes una clase ControlRemoto
que actúa como invocador y toma comandos para ejecutarlos:
// Clase ControlRemoto
class ControlRemoto {
private Comando comando;
public void setComando(Comando comando) {
this.comando = comando;
}
public void presionarBoton() {
comando.ejecutar();
}
}
Ahora puedes usar estos componentes para demostrar el patrón Command:
public class Principal {
public static void main(String[] args) {
// Crear un dispositivo
Dispositivo dispositivo = new Dispositivo();
// Crear comandos con el dispositivo asociado
ComandoEncender encender = new ComandoEncender(dispositivo);
ComandoApagar apagar = new ComandoApagar(dispositivo);
// Crear un control remoto
ControlRemoto controlRemoto = new ControlRemoto();
// Asignar comandos al control remoto
controlRemoto.setComando(encender);
// Presionar el botón del control remoto
controlRemoto.presionarBoton();
// Cambiar el comando en tiempo de ejecución
controlRemoto.setComando(apagar);
// Presionar el botón del control remoto nuevamente
controlRemoto.presionarBoton();
}
}
Cuándo usar el patrón Command:
- Parametrización de Objetos con Operaciones:
- Cuando necesitas parametrizar objetos con operaciones, retrasar la ejecución de una operación o poner operaciones en una cola.
- Desacoplamiento entre Emisores y Receptores:
- Para desacoplar el objeto que emite una solicitud (invocador) del objeto que la realiza (receptor), permitiendo mayor flexibilidad y extensibilidad.
- Historial y Reversión de Operaciones:
- Para mantener un historial de operaciones ejecutadas y permitir la reversión de esas operaciones.
- Implementación de Funcionalidades Tipo Macro:
- Cuando deseas implementar funcionalidades tipo macro, que involucran varias operaciones encapsuladas en un solo comando.
El patrón Command es particularmente útil cuando necesitas desacoplar la clase que emite una solicitud de la que la realiza, o cuando necesitas soportar operaciones reversibles y mantener un historial de acciones realizadas. Proporciona una manera elegante de encapsular una solicitud como un objeto.