Está en la página 1de 14

Patrones de Diseo

Patrn de comportamiento Command

Tcnicas de Programacin - Curso 2007/08


Command
Propsito
z Encapsular peticiones en forma de objetos.

z Permite parametrizar a los clientes con distintas


peticiones, hacer colas de peticiones, llevar un
registro de la peticiones realizadas, y deshacer el
efecto de las peticiones.

z Tambin conocido como action, transaction


Command
Motivacin
z Ej: framework grfico con objetos como botones, mens ...
que realizan operaciones en base a eventos de usuario. El
comportamiento del objeto depende de la aplicacin

z Solucin:
z Encapsular las peticiones como objetos

command
Application Menu MenuItem Command
add (Document) add (MenuItem) clicked () execute ()

Document
open () command.execute()
close ()
cut ()
copy ()
paste ()
Command
Motivacin
commands
Command
execute ()

doc
Document PasteCommand OpenCommand MacroCommand
open () execute () execute () execute ()
close () askUser ()
cut ()
copy ()
paste () name = askUser() forall c in commands
doc.paste() c.execute()
doc = new Document(name)
application.add(doc)
doc.open()

application

Application
add (Document)
Command
Aplicabilidad
z Usa el patrn Command si quieres:

z Parametrizar objetos mediante una accin

z Especificar, encolar y ejecutar peticiones en distintos momentos


(el objeto command tiene un tiempo de vida distinto de la peticin)

z Operaciones deshacer (mtodo adicional en command)

z Acciones de recuperacin del sistema (mtodos adicionales salvar


y recuperar en command)

z Interfaz comn que permita invocar las acciones de modo uniforme,


y extender el sistema con nuevas acciones de forma sencilla
Command
Estructura

Invoker Command
+ execute()

Receiver receiver
Client + action() ConcreteCommand
- state

+ execute()

receiver.action()
Command
Participantes
z Command: define la interfaz de ejecucin de operaciones

z ConcreteCommand (PasteCommand, OpenCommand): Implementa


la interfaz de ejecucin invocando operaciones del receptor. De
este modo relaciona una accin con un receptor

z Client (Application): crea un comando concreto e indica a quin va


dirigido (receptor)

z Invoker (MenuItem): contiene el comando asociado a la peticin

z Receiver (Document, Application): sabe cmo realizar las operaciones


asociadas a una peticin. Cualquier clase puede actuar como receptor.
Command
Colaboraciones (ejemplo)

d:Documento :Editor paste:MenuItem

new ComandoPaste (d) comando:


ComandoPaste
addComando (comando)

execute ()

paste ()
Command
Colaboraciones (ejemplo)

ed:Editor crear:MenuItem

new ComandoCrear (ed) comando:


ComandoCrear
addComando (comando)

execute ()

d:Documento

add (d)

open ()
Command
Consecuencias
z Desacopla el objeto que invoca la operacin del que sabe
cmo llevarla a cabo

z Los comandos son entidades de primer orden: se pueden


manipular y extender como cualquier otro objeto

z Se pueden crear macro-comandos (patrn composite)

z Es fcil aadir nuevos comandos ya que no es necesario


cambiar las clases existentes
Command
Implementacin
z Cmo de inteligente debe ser un comando? 2 extremos:
z Invocan una accin en el receptor
z Implementan el comportamiento sin delegar: til para comandos
independientes de un receptor, o cuando el receptor est implcito

z Cmo implementar las operaciones undo y redo?


z Operaciones adicionales en command
z Almacenar el estado previo a la ejecucin del comando: objeto
receptor, argumentos de la operacin, valores del receptor que
puedan cambiar tras ejecutar el comando
z Almacenar el estado anterior a la ejecucin del
comando permite hacer un undo
z Almacenar todos los estados anteriores permite
hacer n undo
Command
Cdigo de ejemplo
public interface Command {
public void execute();
}

public class CommandGenerarNominas implements Command {


private Universidad _universidad;
public CommandGenerarNominas (Universidad universidad) {
_universidad = universidad;
}
public void execute() {
_universidad.generarNominas();
}
}

public class MenuUniversidad {


public boolean menuPrincipal {
...
case 3: // generar nminas
// _universidad.generarNominas();
Command comando = new CommandGenerarNominas(_universidad);
comando.execute();
break;
}
}
Command
Ejercicio
z Se quiere desarrollar una clase que ejecute peridicamente tareas
de mantenimiento del sistema (ej. realizar copias de seguridad del
sistema, ejecutar el antivirus, etc.)

z Cada tarea est implementada como un mtodo de alguna clase


existente

z Se quiere que la nueva clase tenga un bajo acoplamiento con las


clases que implementan dichas tareas
Command
Solucin

PlanificadorTareas Tarea
+ aadirTarea(Tarea) - frecuencia
+ eliminarTarea(Tarea) - ultimaEjecucion
+ execute()

ClaseSistema CopiaSeguridad PasarAntivirus


+ action() + execute() + execute()

claseSistema.action();

También podría gustarte