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