39
Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Embed Size (px)

Citation preview

Page 1: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Patrones de Diseño: Command

Oscar Sanz MerinoNicolas Moreno Ishii Alex Cuervo Faucha

Page 2: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 3: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 4: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Introducción.

Command es un patrón de comportamiento.

Tambien conocido como Action, Transaction.

Especifica una forma simple de separar la ejecución de un comando del entorno que generó dicho comando.

Page 5: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 6: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 7: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Intención

Permite solicitar una operación a un objeto sin conocer el contenido ni el receptor real de la misma.

Encapsula un mensaje como un objeto, lo que permite gestionar: colas o registros de mensajes. el deshacer las operaciones realizadas.

Ofrece una interfaz común que aporta: uniformidad al invocar las acciones. sencillez al extender el sistema con nuevas acciones.

Page 8: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 9: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 10: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Motivación.

El concepto de orden (command) es ambiguo y complejo

pero está muy extendido. Podemos mencionar como ejemplos: intérpretes de órdenes del sistema operativo. lenguajes de macros de paquetes ofimáticos. gestores de bases de datos. protocolos de servidores de Internet.

El patrón presenta una forma sencilla y versátil de implementar

un sistema basado en comandos: facilidad de uso y ampliación.

Page 11: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 12: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 13: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Aplicaciones

Se suele aplicar cuando se quiere:

Facilitar la parametrización de las acciones a realizar. Independizar el momento de petición del de ejecución.

Implementar CallBacks. El parámetro de una orden puede ser otra orden a ejecutar.

Soportar o permitir el "deshacer".

Desarrollar sistemas utilizando órdenes de alto nivel que se construyen con operaciones sencillas (primitivas).

Page 14: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 15: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 16: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Estructura Estructura del patrón Command:

Page 17: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 18: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 19: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Participantes

Orden: (“Command”) declara una interfaz para ejecutar una operación.

Orden Concreta: (“ConcreteCommand”) define un enlace entre un objeto “Receiver” y una acción. implementa “Execute” invocando la(s) correspondiente(s)

operación(es) del “Receiver”.

Cliente: (“Client”)

crea un objeto “ConcreteCommand” y establece su receptor.

Page 20: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Participantes

Invocador: (“Invoker”) le pide a la orden que ejecute la petición.

Receptor: (“Receiver”) sabe como llevar a cabo las operaciones asociadas a una

petición. Cualquier clase puede hacer actuar como “Receiver”.

Page 21: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 22: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 23: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Colaboraciones

El cliente crea un objeto “ConcreteCommand” y especifica su receptor.

Un objeto “Invoker” almacena el objeto “ConcreteCommand”

El invocador envia una petición llamando a “Execute” sobre la orden. Cuando las ordenes se pueden deshacer:

“ConcreteCommand” guarda el estado para deshacer la orden antes de llamar a “Execute”.

El objeto “ConcreteCommand”, invoca operaciones de su receptor para llevar a cabo la petición.

Page 24: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 25: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 26: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Consecuencias

Orden desacoplada:

El objeto que invoca la operación de aquél que sabe como realizarla.

Las órdenes son objeto de primera clase. Manipulados y extendidos de forma natural.

Se pueden ensamblar órdenes en una orden compuesta. Es una instancia del patrón “Composite”.

Facilidad de adición de nuevas órdenes. ¿Por que es debido esto?

no hace falta cambiar las clases existentes.

Page 27: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 28: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 29: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Debemos tener en cuenta:

¿Como deberia ser de inteligente una orden? (ampl. conj. habilidades)

Implementandolo todo ella misma, sin delegar nada en el receptor.

Se define un enlace entre un receptor y las acciones que lleva a cabo la orden.

Permitir deshacer y repetir.

Evitar la acumulación de errores en el proceso de deshacer: A medida que se ejecutan y deshacen las órdenes repetidamente. El estado de la aplicación finalmente puede diferir de sus valores

originales

Uso de plantillas en un LP (Ejemplo: C++) Para evitar crear una subclase de Orden para cada clase de acción y

receptor.

Implementación

Page 30: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 31: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 32: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Código de ejemplo Ejemplo en Java:

public interface Command{

void execute();

}

public class CommandGenerarNominas implements Command{

Universidad _universidad;

public CommandGenerarNominas(Universidad universidad){

_universidad = universidad;}

public void execute(){

_universidad.generarNominas();

}

}

Page 33: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Código de ejemplo (cont.)

Ejemplo en Java:

public class MenuUniversidad {

public boolean menuPrincipal(){

...

case 3: // generar nominas

// _universidad.generarNominas();

Command comando;

comando = new CommandGenerarNominas(_universidad);

comando.execute();

break;

...

}

}

Page 34: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 35: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 36: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Usos conocidos

Las clases Button y MenuItem de Java:

Facilitan la utilización de este patrón.

Declaran los métodos getActionCommand y setActionCommand para dar nombres a las acciones realizadas por los objetos.

Facilitan una correspondencia entre ambos.

Page 37: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 38: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Índice1. Introducción.2. Intención.3. Motivación.4. Aplicabilidad.5. Estructura.6. Participantes.7. Colaboraciones.8. Consecuencias.9. Implementación.10. Código de ejemplo.11. Usos conocidos.12. Patrones relacionados.

Page 39: Patrones de Diseño: Command Oscar Sanz Merino Nicolas Moreno Ishii Alex Cuervo Faucha

Patrones relacionados

Factory Method: Ofrece una forma alternativa de llamar a los órdenes además del uso del

command manager.

Intérprete: Se puede implementar un pequeño Intérprete mediante clases Command.

Template Method: Sirve para implementar la lógica de “Deshacer” de forma automática.

Composite y Prototype: Permite realizar agrupaciones de órdenes de forma similar a una macro. Hay quien lo utiliza para implementar la copia de la orden al histórico de

órdenes.