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

Post on 28-Jan-2016

218 views 0 download

Transcript of 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

Í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.

Í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.

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.

Í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.

Í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.

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.

Í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.

Í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.

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.

Í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.

Í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.

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).

Í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.

Í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.

Estructura Estructura del patrón Command:

Í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.

Í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.

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.

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”.

Í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.

Í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.

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.

Í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.

Í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.

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.

Í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.

Í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.

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

Í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.

Í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.

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();

}

}

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;

...

}

}

Í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.

Í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.

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.

Í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.

Í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.

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.