SlideShare una empresa de Scribd logo
1 de 14
Descargar para leer sin conexión
Técnicas de Programación - Curso 2007/08
Patrones de Diseño
Patrón de comportamiento Command
Command
Propósito
Encapsular peticiones en forma de objetos.
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.
También conocido como action, transaction
Command
Motivación
Ej: framework gráfico con objetos como botones, menús ...
que realizan operaciones en base a eventos de usuario. El
comportamiento del objeto depende de la aplicación
Solución:
Encapsular las peticiones como objetos
Application
add (Document)
command
Menu
add (MenuItem)
Document
open ()
close ()
cut ()
copy ()
paste ()
MenuItem
clicked ()
Command
execute ()
command.execute()
Command
Motivación
Document
open ()
close ()
cut ()
copy ()
paste ()
Command
execute ()
doc.paste()
PasteCommand
execute ()
OpenCommand
execute ()
askUser ()
Application
add (Document)
name = askUser()
doc = new Document(name)
application.add(doc)
doc.open()
MacroCommand
execute ()
forall c in commands
c.execute()
doc
application
commands
Command
Aplicabilidad
Usa el patrón Command si quieres:
Parametrizar objetos mediante una acción
Especificar, encolar y ejecutar peticiones en distintos momentos
(el objeto command tiene un tiempo de vida distinto de la petición)
Operaciones deshacer (método adicional en command)
Acciones de recuperación del sistema (métodos adicionales salvar
y recuperar en command)
Interfaz común que permita invocar las acciones de modo uniforme,
y extender el sistema con nuevas acciones de forma sencilla
Command
Estructura
Command
+ execute()
Client
Receiver
+ action()
receiver.action()
Invoker
ConcreteCommand
- state
+ execute()
receiver
Command
Participantes
Command: define la interfaz de ejecución de operaciones
ConcreteCommand (PasteCommand, OpenCommand): Implementa
la interfaz de ejecución invocando operaciones del receptor. De
este modo relaciona una acción con un receptor
Client (Application): crea un comando concreto e indica a quién va
dirigido (receptor)
Invoker (MenuItem): contiene el comando asociado a la petición
Receiver (Document, Application): sabe cómo realizar las operaciones
asociadas a una petición. Cualquier clase puede actuar como receptor.
Command
Colaboraciones (ejemplo)
d:Documento :Editor
comando:
ComandoPaste
new ComandoPaste (d)
execute ()
paste ()
paste:MenuItem
addComando (comando)
Command
Colaboraciones (ejemplo)
d:Documento
ed:Editor
comando:
ComandoCrear
new ComandoCrear (ed)
execute ()
crear:MenuItem
addComando (comando)
add (d)
open ()
Command
Consecuencias
Desacopla el objeto que invoca la operación del que sabe
cómo llevarla a cabo
Los comandos son entidades de “primer orden”: se pueden
manipular y extender como cualquier otro objeto
Se pueden crear macro-comandos (patrón composite)
Es fácil añadir nuevos comandos ya que no es necesario
cambiar las clases existentes
Command
Implementación
¿Cómo de inteligente debe ser un comando? 2 extremos:
Invocan una acción en el receptor
Implementan el comportamiento sin delegar: útil para comandos
independientes de un receptor, o cuando el receptor está implícito
¿Cómo implementar las operaciones undo y redo?
Operaciones adicionales en command
Almacenar el estado previo a la ejecución del comando: objeto
receptor, argumentos de la operación, valores del receptor que
puedan cambiar tras ejecutar el comando
Almacenar el estado anterior a la ejecución del
comando permite hacer un undo
Almacenar todos los estados anteriores permite
hacer n undo
Command
Código 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 nóminas
// _universidad.generarNominas();
Command comando = new CommandGenerarNominas(_universidad);
comando.execute();
break;
}
}
Command
Ejercicio
Se quiere desarrollar una clase que ejecute periódicamente tareas
de mantenimiento del sistema (ej. realizar copias de seguridad del
sistema, ejecutar el antivirus, etc.)
Cada tarea está implementada como un método de alguna clase
existente
Se quiere que la nueva clase tenga un bajo acoplamiento con las
clases que implementan dichas tareas
Command
Solución
Tarea
+ execute()
CopiaSeguridad
+ execute()
PasarAntivirus
+ execute()
PlanificadorTareas
+ añadirTarea(Tarea)
+ eliminarTarea(Tarea)
- frecuencia
- ultimaEjecucion
ClaseSistema
+ action()
claseSistema.action();

Más contenido relacionado

La actualidad más candente

La actualidad más candente (19)

Manejo de triggers en sql server
Manejo de triggers en sql server Manejo de triggers en sql server
Manejo de triggers en sql server
 
Qué es SQL
Qué es SQL Qué es SQL
Qué es SQL
 
Triggers
TriggersTriggers
Triggers
 
Semana 6 Módulos en Python Entrega 1
Semana 6   Módulos en Python Entrega 1Semana 6   Módulos en Python Entrega 1
Semana 6 Módulos en Python Entrega 1
 
Punteros4
Punteros4Punteros4
Punteros4
 
Resumen 16 primeras clips
Resumen 16 primeras clipsResumen 16 primeras clips
Resumen 16 primeras clips
 
TRIGGERS Cliente - servidor
TRIGGERS Cliente - servidorTRIGGERS Cliente - servidor
TRIGGERS Cliente - servidor
 
Ejemplos Borland C++ Builder
Ejemplos Borland C++ BuilderEjemplos Borland C++ Builder
Ejemplos Borland C++ Builder
 
Prog gui
Prog guiProg gui
Prog gui
 
Aplication
AplicationAplication
Aplication
 
Capítulo 2 - Interfaces de usuario gráficas (AWT)
Capítulo 2 - Interfaces de usuario gráficas (AWT)Capítulo 2 - Interfaces de usuario gráficas (AWT)
Capítulo 2 - Interfaces de usuario gráficas (AWT)
 
Procedimientos Almacenados
Procedimientos AlmacenadosProcedimientos Almacenados
Procedimientos Almacenados
 
Apuntes de estructuras nuevo
Apuntes de estructuras nuevoApuntes de estructuras nuevo
Apuntes de estructuras nuevo
 
Statement
Statement Statement
Statement
 
Botón cantycelar cmd cancelar
Botón cantycelar  cmd cancelarBotón cantycelar  cmd cancelar
Botón cantycelar cmd cancelar
 
Statement
StatementStatement
Statement
 
MANEJO DE SENTENCIAS DE DEFINICION
MANEJO DE SENTENCIAS DE DEFINICIONMANEJO DE SENTENCIAS DE DEFINICION
MANEJO DE SENTENCIAS DE DEFINICION
 
My Sql A C#
My Sql A C#My Sql A C#
My Sql A C#
 
Sesión02 - Creación de objetos (Oracle)
Sesión02 - Creación de objetos (Oracle)Sesión02 - Creación de objetos (Oracle)
Sesión02 - Creación de objetos (Oracle)
 

Similar a 09 command

Aplicaciones de escritorio con base de datos
Aplicaciones de escritorio con base de datosAplicaciones de escritorio con base de datos
Aplicaciones de escritorio con base de datosmariluruizramirez97
 
Aplicaciones de escritorio con base de datos
Aplicaciones de escritorio con base de datosAplicaciones de escritorio con base de datos
Aplicaciones de escritorio con base de datosteresanorato
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggersLuis Jherry
 
Efc programación .net-luis fernando aguas - 22012022 1700
Efc programación .net-luis fernando aguas - 22012022 1700Efc programación .net-luis fernando aguas - 22012022 1700
Efc programación .net-luis fernando aguas - 22012022 1700Luis Fernando Aguas Bucheli
 
Interfaces Usuario 3
Interfaces Usuario 3Interfaces Usuario 3
Interfaces Usuario 3Milaly
 
PowerShell para administradores
PowerShell para administradoresPowerShell para administradores
PowerShell para administradoresPablo Campos
 
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Juan Manuel
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado JavascriptEl Jota
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoJuan Rodríguez
 
Desarrollo en Capas con .Net
Desarrollo en Capas con .NetDesarrollo en Capas con .Net
Desarrollo en Capas con .NetJorge Ercoli
 
Dce2 introduccion win_forms
Dce2 introduccion win_formsDce2 introduccion win_forms
Dce2 introduccion win_formsguest85b8e5a
 
Dce2 Introduccion Win Forms
Dce2 Introduccion Win FormsDce2 Introduccion Win Forms
Dce2 Introduccion Win FormsEsteban Soraire
 
Dce2 introduccion win_forms
Dce2 introduccion win_formsDce2 introduccion win_forms
Dce2 introduccion win_formsguest85b8e5a
 

Similar a 09 command (20)

Aplicaciones de escritorio con base de datos
Aplicaciones de escritorio con base de datosAplicaciones de escritorio con base de datos
Aplicaciones de escritorio con base de datos
 
Aplicaciones de escritorio con base de datos
Aplicaciones de escritorio con base de datosAplicaciones de escritorio con base de datos
Aplicaciones de escritorio con base de datos
 
Introducción a DJango
Introducción a DJangoIntroducción a DJango
Introducción a DJango
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
 
Efc programación .net-luis fernando aguas - 22012022 1700
Efc programación .net-luis fernando aguas - 22012022 1700Efc programación .net-luis fernando aguas - 22012022 1700
Efc programación .net-luis fernando aguas - 22012022 1700
 
Visual basic 1º Año
Visual basic  1º AñoVisual basic  1º Año
Visual basic 1º Año
 
Introduccion a j_query
Introduccion a j_queryIntroduccion a j_query
Introduccion a j_query
 
Interfaces Usuario 3
Interfaces Usuario 3Interfaces Usuario 3
Interfaces Usuario 3
 
PowerShell para administradores
PowerShell para administradoresPowerShell para administradores
PowerShell para administradores
 
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
 
Unidad 4
Unidad 4Unidad 4
Unidad 4
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 
Mi dlet
Mi dletMi dlet
Mi dlet
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con Django
 
Desarrollo en Capas con .Net
Desarrollo en Capas con .NetDesarrollo en Capas con .Net
Desarrollo en Capas con .Net
 
Cap7 2
Cap7 2Cap7 2
Cap7 2
 
Dce2 introduccion win_forms
Dce2 introduccion win_formsDce2 introduccion win_forms
Dce2 introduccion win_forms
 
Dce2 Introduccion Win Forms
Dce2 Introduccion Win FormsDce2 Introduccion Win Forms
Dce2 Introduccion Win Forms
 
Dce2 introduccion win_forms
Dce2 introduccion win_formsDce2 introduccion win_forms
Dce2 introduccion win_forms
 
Introduccion a Windows Form
Introduccion a Windows FormIntroduccion a Windows Form
Introduccion a Windows Form
 

09 command

  • 1. Técnicas de Programación - Curso 2007/08 Patrones de Diseño Patrón de comportamiento Command
  • 2. Command Propósito Encapsular peticiones en forma de objetos. 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. También conocido como action, transaction
  • 3. Command Motivación Ej: framework gráfico con objetos como botones, menús ... que realizan operaciones en base a eventos de usuario. El comportamiento del objeto depende de la aplicación Solución: Encapsular las peticiones como objetos Application add (Document) command Menu add (MenuItem) Document open () close () cut () copy () paste () MenuItem clicked () Command execute () command.execute()
  • 4. Command Motivación Document open () close () cut () copy () paste () Command execute () doc.paste() PasteCommand execute () OpenCommand execute () askUser () Application add (Document) name = askUser() doc = new Document(name) application.add(doc) doc.open() MacroCommand execute () forall c in commands c.execute() doc application commands
  • 5. Command Aplicabilidad Usa el patrón Command si quieres: Parametrizar objetos mediante una acción Especificar, encolar y ejecutar peticiones en distintos momentos (el objeto command tiene un tiempo de vida distinto de la petición) Operaciones deshacer (método adicional en command) Acciones de recuperación del sistema (métodos adicionales salvar y recuperar en command) Interfaz común que permita invocar las acciones de modo uniforme, y extender el sistema con nuevas acciones de forma sencilla
  • 7. Command Participantes Command: define la interfaz de ejecución de operaciones ConcreteCommand (PasteCommand, OpenCommand): Implementa la interfaz de ejecución invocando operaciones del receptor. De este modo relaciona una acción con un receptor Client (Application): crea un comando concreto e indica a quién va dirigido (receptor) Invoker (MenuItem): contiene el comando asociado a la petición Receiver (Document, Application): sabe cómo realizar las operaciones asociadas a una petición. Cualquier clase puede actuar como receptor.
  • 8. Command Colaboraciones (ejemplo) d:Documento :Editor comando: ComandoPaste new ComandoPaste (d) execute () paste () paste:MenuItem addComando (comando)
  • 9. Command Colaboraciones (ejemplo) d:Documento ed:Editor comando: ComandoCrear new ComandoCrear (ed) execute () crear:MenuItem addComando (comando) add (d) open ()
  • 10. Command Consecuencias Desacopla el objeto que invoca la operación del que sabe cómo llevarla a cabo Los comandos son entidades de “primer orden”: se pueden manipular y extender como cualquier otro objeto Se pueden crear macro-comandos (patrón composite) Es fácil añadir nuevos comandos ya que no es necesario cambiar las clases existentes
  • 11. Command Implementación ¿Cómo de inteligente debe ser un comando? 2 extremos: Invocan una acción en el receptor Implementan el comportamiento sin delegar: útil para comandos independientes de un receptor, o cuando el receptor está implícito ¿Cómo implementar las operaciones undo y redo? Operaciones adicionales en command Almacenar el estado previo a la ejecución del comando: objeto receptor, argumentos de la operación, valores del receptor que puedan cambiar tras ejecutar el comando Almacenar el estado anterior a la ejecución del comando permite hacer un undo Almacenar todos los estados anteriores permite hacer n undo
  • 12. Command Código 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 nóminas // _universidad.generarNominas(); Command comando = new CommandGenerarNominas(_universidad); comando.execute(); break; } }
  • 13. Command Ejercicio Se quiere desarrollar una clase que ejecute periódicamente tareas de mantenimiento del sistema (ej. realizar copias de seguridad del sistema, ejecutar el antivirus, etc.) Cada tarea está implementada como un método de alguna clase existente Se quiere que la nueva clase tenga un bajo acoplamiento con las clases que implementan dichas tareas
  • 14. Command Solución Tarea + execute() CopiaSeguridad + execute() PasarAntivirus + execute() PlanificadorTareas + añadirTarea(Tarea) + eliminarTarea(Tarea) - frecuencia - ultimaEjecucion ClaseSistema + action() claseSistema.action();