Descargar

Patrones de Comportamiento del Software (página 2)

Enviado por Pablo Turmero


Partes: 1, 2, 3, 4
edu.red 11 Cadena de Responsabilidad Ejemplo 2: Sistema de control de seguridad Existen varios sensores que transmiten el estado a un ordenador central. La acción de un sensor depende del contexto que lo incluye (jerarquía de áreas o zonas de seguridad). Un sensor pasa el evento al agregado que lo incluye.

edu.red 12 Command (Orden) Propósito Encapsula un mensaje como un objeto, permitiendo parametrizar los clientes con diferentes solicitudes, añadir a una cola las solicitudes y soportar funcionalidad deshacer/rehacer (undo/redo) Motivación Algunas veces es necesario enviar mensaje a un objeto sin conocer el selector del mensaje ni el objeto receptor. Por ejemplo widgets (botones, menús,..) realizan una acción como respuesta a la interacción del usuario, pero no se puede explicitar en su implementación.

edu.red 13 Motivación Command

edu.red 14 Estructura Command

edu.red 15 Colaboración Command (Gp:) r : Receptor (Gp:) : Cliente (Gp:) co : Command (Gp:) : Invocador (Gp:) 1. Command (r) (Gp:) 2. registrarCommand(co) (Gp:) 1. ejecutar() (Gp:) 1.1. accion()

edu.red 16 Command Aplicabilidad Parametrizar objetos por la acción a realizar (alternativa a funciones Callback: función que es registrada en el sistema para ser llamada más tarde; en C++ se puede usar punteros a funciones) Especificar, añadir a una cola y ejecutar mensajes en diferentes instantes: un objeto Command tiene un tiempo de vida independiente de la solicitud original. Soportar facilidad undo/redo. Recuperación de fallos.

edu.red 17 Command Consecuencias Desacopla el objeto que invoca la operación del objeto que sabe cómo realizarla. Cada subclase CommandConcreto especifica un par receptor/acción, almacenando el receptor como un atributo e implementando el método ejecutar. Objetos command pueden ser manipulados como cualquier otro objeto. Se pueden crear command compuestos (aplicando el patrón Composite). Es fácil añadir nuevos commands. Un objeto Command es realmente un Adapter.

edu.red 18 Command Implementación ¿Cuál debe ser la “inteligencia” de un command? No delegar en nadie Encontrar dinámicamente el objeto receptor y delegar en él Soportar undo/redo Atributos para almacenar estado y argumentos de la operación. Lista de objetos commands En la lista se colocan copias.

edu.red 19 Mecanismo undo/redo

edu.red 20 Mecanismo undo/redo public void invocarCommand (AbstractCommand command){ if (command instanceof Undo) { undo(); return; } if (command instanceof Redo) { redo(); return; } if (command.doIt()) { addToHistory(command); } else { historiaList.clear();} if (redoList.size() > 0) redoList.clear(); } private void undo() { if (historyList.size() > 0) { AbstractCommand ac; undoCmd = (AbstractCommand) historyList.removeFirst(); undoCmd.undoIt(); redoList.addFirst(undoCmd); }

edu.red 21 Command En lenguajes como Eiffel o Java no es posible que un método pueda actuar como argumento de otro método. Por ello es necesario definir una clase (functor ) que encapsule al método y sus instancias se pasarán como argumento. Ejemplos en Java: Comparator, Observer, ActionListener, …

edu.red 22 Ejemplos Functor Ejemplo 1: Comparar dos objetos utilizando cualquier criterio de ordenación: interfaz Comparator en Java

public interface Comparator { int compare (Object o1, Object o2); }

Un objeto Comparator puede ser pasado a una rutina de ordenación o ser utilizado por una colección para mantener el orden de sus elementos.

Ejemplo 2: Interfaz Observer en el patrón Observer.

Ejemplo 3: Interfaces listener en el modelo de delegación de eventos.

edu.red 23 Ejemplo

edu.red 24 Command Implementación Podemos evitar la jerarquía de subclases de Command si no necesitamos la facilidad undo/redo con metaclases. En Smalltalk,

self receptor perform: unSelector with: unArg

Un objeto functor normalmente implementa el comportamiento deseado sin delegar. Un objeto command normalmente delega en otro objeto. Un objeto command actúa como un functor si tan sólo implementa el comportamiento deseado.

edu.red 25 Command Ejercicio: Escribir una clase con la funcionalidad de ejecutar periódicamente uno o más métodos sobre diferentes objetos. Por ejemplo, ejecutar una operación de copia de seguridad cada hora o una operación de comprobación de estado de un disco cada 10 minutos o imprimir la secuencia de Fibonacci. Se desea que la clase no conozca qué operaciones concretas debe ejecutar ni los objetos sobre los que debe aplicarlas. Esto es, se debe desacoplar la clase que planifica la ejecución de esos métodos de las clases que realmente proporcionan las operaciones a ejecutar.

edu.red 26 Interpreter Propósito Dado un lenguaje, definir una representación para su gramática junto con un intérprete que utiliza la representación para interpretar sentencias en dicho lenguaje. Motivación Interpretar una expresión regular. Usa una clase para representar cada regla, los símbolos en la parte derecha son atributos. Aplicabilidad Usar si la gramática es simple y la eficiencia no es importante.

edu.red 27 Intérprete expre := literal | cond | seq | rep alt := expre ‘|’ expre seq := expre ‘&’ expre rep := expre ‘*’ literal := ‘a’|’b’|’c’|…{‘a’|’b’|’c’|…| } *

edu.red 28 Intérprete

edu.red 29 Intérprete lluvias | (trasvase & desaladoras) *

edu.red 30 Interpreter Estructura

Partes: 1, 2, 3, 4
 Página anterior Volver al principio del trabajoPágina siguiente