Design patterns
Patrón de comando
Buscar..
Ejemplo de patrón de comando en Java
definición de wikipedia :
El patrón de comando es un patrón de diseño de comportamiento en el que un objeto se utiliza para encapsular toda la información necesaria para realizar una acción o desencadenar un evento en un momento posterior
Diagrama UML de dofactory :
Componentes básicos y flujo de trabajo:
-
Command
declara una interfaz para los comandos abstractos comoexecute()
-
Receiver
sabe cómo ejecutar un comando en particular -
Invoker
poseeConcreteCommand
, que debe ser ejecutado. -
Client
creaConcreteCommand
y asigna unReceiver
-
ConcreteCommand
define el enlace entreCommand
yReceiver
De esta manera, el patrón de comando desacopla al remitente (cliente) del receptor a través del invocador . El Invoker tiene un conocimiento completo de qué Comando se ejecutará y el Comando sabe qué Receptor se debe invocar para ejecutar una operación en particular.
Fragmento de código:
interface Command {
void execute();
}
class Receiver {
public void switchOn(){
System.out.println("Switch on from:"+this.getClass().getSimpleName());
}
}
class OnCommand implements Command{
private Receiver receiver;
public OnCommand(Receiver receiver){
this.receiver = receiver;
}
public void execute(){
receiver.switchOn();
}
}
class Invoker {
private Command command;
public Invoker(Command command){
this.command = command;
}
public void execute(){
this.command.execute();
}
}
class TV extends Receiver{
public String toString(){
return this.getClass().getSimpleName();
}
}
class DVDPlayer extends Receiver{
public String toString(){
return this.getClass().getSimpleName();
}
}
public class CommandDemoEx{
public static void main(String args[]){
// On command for TV with same invoker
Receiver receiver = new TV();
Command onCommand = new OnCommand(receiver);
Invoker invoker = new Invoker(onCommand);
invoker.execute();
// On command for DVDPlayer with same invoker
receiver = new DVDPlayer();
onCommand = new OnCommand(receiver);
invoker = new Invoker(onCommand);
invoker.execute();
}
}
salida:
Switch on from:TV
Switch on from:DVDPlayer
Explicación:
En este ejemplo,
- La interfaz de comandos define el método
execute()
. - OnCommand es ConcreteCommand , que implementa el método
execute()
. - El receptor es la clase base.
- TV y DVDPlayer son dos tipos de receptores , que se pasan a ConcreteCommand como OnCommand.
- Invoker contiene el comando . Es la clave para separar el remitente del receptor .
- El invocador recibe OnCommand -> que llama a Receiver (TV) para ejecutar este comando.
Al usar Invoker, puedes encender TV y DVDPlayer. Si extiendes este programa, también apagarás TV y DVDPlayer.
Casos de uso clave:
- Para implementar el mecanismo de devolución de llamada.
- Implementar funcionalidad deshacer y rehacer.
- Mantener un historial de comandos.