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
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
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(); } }
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
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
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
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.
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,…
40 Visitor Motivación
41 Visitor Motivación
42 Visitor Motivación
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.
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.
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
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)
Página anterior | Volver al principio del trabajo | Página siguiente |