Descargar

Diseño de Software – Observer, State y Visitor (página 3)

Enviado por Pablo Turmero


Partes: 1, 2, 3
edu.red 31 Estrategia Consecuencias Define una familia de algoritmos relacionados. Una alternativa a crear subclases de la clase Contexto. Elimina sentencias CASE El cliente puede elegir entre diferentes estrategias o implementaciones: debe conocer detalles Se incrementa el número de objetos: usar Flyweight State y Strategy son similares, cambia el Propósito: ejemplos de composición con delegación

edu.red 32 Estrategia Implementación ¿Cómo una estrategia concreta accede a los datos del contexto? Pasar datos como argumentos Pasar el contexto como argumento Estrategia almacena una referencia al contexto

edu.red 33 Template Method (Método Plantilla) Propósito Define el esqueleto (esquema, patrón) de un algoritmo en una operación, difiriendo algunos pasos a las subclases. Permite a las subclases redefinir ciertos pasos de un algoritmo sin cambiar la estructura del algoritmo. Motivación Fundamental para escribir código en un framework. Clase Aplicación que maneja objetos de la clase Documento: método OpenDocument

edu.red 34 Método Plantilla void openDocument (String nombre) { if (! canOpenDocument (nombre)) { return; } Document doc = createDocument(); if (doc != null) { docs. addDocument(doc); aboutToOpenDocument (doc); doc.open(); doc.read(); } }

edu.red 35 Método Plantilla has(v:G): Boolean is do from start until after or else equal (v,item) loop forth end Result := not after end

edu.red 36 Método Plantilla Aplicabilidad Implementar las partes fijas de un algoritmo y dejar que las subclases implementen el comportamiento que puede variar. Cuando el comportamiento común entre varias subclases debe ser factorizado y localizado en una superclase común. Controlar extensiones de las subclases: algoritmos con puntos de extensión

edu.red 37 Método Plantilla Consecuencias Técnica fundamental para la reutilización: factorizar comportamiento común en librerías de clases Estructura de control invertida conocida como “Principio de Hollywood”: “No nos llames, nosotros te llamaremos”. Un método plantilla invoca a los siguientes tipos de métodos: operaciones abstractas operaciones concretas en la clase abstracta operaciones concretas en clientes métodos factoría métodos hook que proporcionan comportamiento por defecto

edu.red 38 Método Plantilla Implementación Minimizar el número de métodos que es necesario redefinir en las subclases. Nombrar a los métodos que se deben redefinir añadiéndole cierto prefijo, por ejemplo “do”. En C++, métodos a redefinir son protegidos y virtuales, el método plantilla no será virtual.

edu.red 39 Visitor (Visitante) Propósito Representar una operación que debe ser aplicada sobre los elementos de una estructura de objetos. Permite definir una nueva operación sin cambiar las clases de los elementos sobre los que opera. Motivación Un compilador que representa los programas como árboles de derivación de la sintaxis abstracta necesita aplicar diferentes operaciones sobre ellos: comprobación de tipos, generación de código, .. y además listados de código fuente, reestructuración de programas,…

edu.red 40 Visitor Motivación

edu.red 41 Visitor Motivación

edu.red 42 Visitor Motivación

edu.red 43 Visitor Aplicabilidad Tenemos una jerarquía de clases que representan objetos de propósito general (p.e. nodos de un árbol de derivación de sintaxis) y podemos utilizarlo en diferentes aplicaciones, lo que implicaría añadir métodos en las clases de la jerarquía. Una estructura de objetos contiene muchas clases de objetos con diferentes interfaces, y se quiere realizar operaciones sobre los objetos que dependen de las clases concretas. Las clases definiendo la estructura de objetos cambian con poca frecuencia, pero a menudo se definen nuevas operaciones sobre la estructura. Mejor definir las operaciones en clases aparte.

edu.red 44 Visitor Consecuencias Facilidad para añadir nuevas operaciones: en vez de distribuir la funcionalidad, se añade un nuevo visitor. Un objeto visitor recoge comportamiento relacionado, lo que simplifica las clases de los elementos. Es difícil añadir nuevas subclases de elementos concretos, ya que implica cambiar la jerarquía de Visitor. A diferencia de un iterador, Visitor puede visitar objetos de clases que no tienen una superclase común. Compromete la encapsulación: los elementos concretos deben permitir a los visitors hacer su trabajo.

edu.red 45 Visitor Implementación El patrón permite añadir operaciones a clases sin cambiarlas. Esto se consigue aplicando la técnica double-dispatch. ¿Quién es responsable del recorrido de la estructura de objetos? Estructura de objetos Un iterador El visitor

edu.red 46 Double-Dispatch (Smalltalk) Point>> + delta ^delta isPoint ifTrue:[(x+delta x) @ (y + delta y)] ifFalse:[(x+delta) @ (y + delta)]

Point>> + delta ^delta addPoint: self Number>> addPoint: aPoint ^(self + aPoint x) @ (self + aPoint y) Point>> addPoint: aPoint ^(self x + aPoint x) @ (self y + aPoint y)

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