Patrones de Diseo
Arquitectura del Software
Curso 2003/2004
Captulo 3
Jess Garca MolinaDepartamento de Informtica y Sistemas
Universidad de Murciahttp://dis.um.es/~jmolina
Patrones de diseo 2
Contenidos
Introduccin a los patrones de diseo GoF Patrones de creacin Patrones estructurales Patrones de comportamiento
Patrones de diseo 3
Arquitectura software y patrones
Una arquitectura orientada a objetos bien estructurada est llena de patrones. La calidad de un sistema orientado a objetos se mide por la atencin que los diseadores han prestado a las colaboraciones entre sus objetos.
Los patrones conducen a arquitecturas ms pequeas, ms simples y ms comprensibles
G. Booch
Patrones de diseo 4
Diseo orientado a objetos
Disear software orientado a objetos es difcil pero disear software orientado a objetos reutilizable es ms difcil todava. Diseos generales y flexibles son muy difciles de encontrar la primera vez
Qu conoce un programador experto que desconoce uno inexperto?
Reutilizar soluciones que funcionaron en el pasado: EXPERIENCIA
Patrones de diseo 5
Patrones
Describen un problema recurrente y una solucin. Cada patrn nombra, explica, evala un diseo
recurrente en sistemas OO. Elementos principales:
Nombre Problema Solucin: Descripcin abstracta Consecuencias
Patrones de diseo 6
Granularidad
Patrones de Cdigo Nivel de lenguaje de programacin
Frameworks Diseos especficos de un dominio de aplicaciones.
Patrones de Diseo Descripciones de clases cuyas instancias colaboran entre s
que deben ser adaptados para resolver problemas de diseo general en un particular contexto.
Un patrn de diseo identifica: Clases, Instancias, Roles,Colaboraciones y la distribucin de responsabilidades.
Patrones de diseo 7
Patrones y frameworks
Un framework es una coleccin organizada de clases que constituyen un diseo reutilizable para una clase especfica de software.
Necesario adaptarlo a una aplicacin particular. Establece la arquitectura de la aplicacin Diferencias:
Patrones son ms abstractos que los frameworks Patrones son elementos arquitecturales ms pequeos Patrones son menos especializados
Patrones de diseo 8
Modelo-Vista-Control
Utilizado para construir interfaces de usuario en Smalltalk-80.
Basado en tres tipos de objetos: Modelo: objetos del dominio Vista: objetos presentacin en pantalla (interfaz de usuario) Controlador: define la forma en que la interfaz reacciona a
la entrada del usuario.
Desacopla el modelo de las vistas.
0102030405060708090
1er trim. 2do trim. 3er trim. 4to trim.
EsteOesteNorte
1tr3tr
4tr2tr
1tr. 2tr. 3tr. 4tr.Este 20 25 90 20Oeste 30 38 32 32Norte 47 47 45 45
Vistas
t1=20t2=25t3=90t4=20
Modelo
Patrones de diseo 10
Modelo-Vista-Control
Utiliza los siguientes patrones: Observer Composite Strategy Decorator Factory method
Patrones de diseo 11
Plantilla de definicin
Nombre Propsito
Qu hace?, Cul es su razn y propsito?, Qucuestin de diseo particular o problema aborda?
Sinnimos Motivacin
Escenario que ilustra un problema particular y cmo el patrn lo resuelve.
Patrones de diseo 12
Plantilla de definicin
Aplicabilidad En qu situaciones puede aplicarse?, Cmo las
reconoces?, ejemplos de diseos que pueden mejorarse.
Estructura Diagramas de clases que ilustran la estructura
Participantes Clases que participan y sus responsabilidades
Colaboraciones Diagramas de interaccin que muestran cmo
colaboran los participantes.
Patrones de diseo 13
Plantilla de definicin
Consecuencias Cmo alcanza el patrn sus objetivos?, Cules son los
compromisos y resultados de usar el patrn?, Alternativas, Costes y Beneficios
Implementacin Tcnicas, heursticas y consejos para la implementacin Hay cuestiones dependientes del lenguaje?
Ejemplo de Cdigo Usos conocidos Patrones relacionados
Patrones de diseo 14
Clasificacin
mbito
Propsito
Estructural ComportamientoCreacin
Clase
Objeto
Factory Method Adapter InterpreterTemplate Method
Abstract FactoryBuilderPrototypeSingleton
AdapterBridge
CompositeDecoratorFacade
FlyweightProxy
Chain of ResponsabilityCommand
IteratorMediatorMementoObserver
StateStrategyVisitor
Patrones de diseo 15
A qu ayudan los patrones?
Encontrar los objetos Tarea difcil Debemos considerar: encapsulacin, flexibilidad,
dependencias, reutilizacin, extensibilidad, rendimiento,.. Clases del anlisis vs. Clases del diseo Clases del diseo no tienen contrapartida en el dominio
Strategy, State, Prototype,... Clases del diseo son claves para hacer el sistema ms
flexible.
16
A qu ayudan los patrones?
Determinar granularidad de los objetos Facade, Flyweight, Builder, Visitor,..
Especificar interfaces Memento, Decorator, Proxy,..
Especificar implementacin de clases Muchos patrones dependen de la distincin entre
herencia de implementacin y herencia de interfaces Observer, State, Chain of Responsability,
programar hacia la interfaz, no hacia la implementacin
Patrones de diseo 17
A qu ayudan los patrones?
Especificar implementacin de clases
programar hacia la interfaz, no hacia la implementacin
No declarar variables de clases concretas sino abstractas.
Patrones de creacin permiten que un sistema estbasado en trminos de interfaces y no en implementaciones.
A qu ayudan los patrones?
Favorecen la reutilizacin
HERENCIA COMPOSICION- Definicin esttica - Definicin dinmica- Sencilla de usar - Uso ms complicado- Fcil modificar la implem. - Es posible cambiar en
estticamente pero no en t.e. tiempo de ejecucin- Se rompe la encapsulacin - No se rompe la encapsulacin
- Requiere que se satisfaga cierta interfaz-Se puede sustituir la implem. en tiempo de ejecucin.
Patrones de diseo 19
A qu ayudan los patrones?
Favorecer la reutilizacin
Favorecer la composicin sobre la herencia de clases
Herencia y composicin trabajan juntasSe suele abusar de la herencia. Los diseos suelen ser ms reutilizables si dependen de la composicin.
Patrones de diseo 20
A qu ayudan los patrones?
Delegacin Forma de hacer que la composicin sea tan potente
como la herencia. Un objeto receptor delega operaciones en su delegado Delegacin vs. forwarding Software ms flexible pero ms complicado. Difcil saber cuando conviene usarla. Presente en muchos patrones: State, Strategy, Visitor,.. Caso extremo de composicin, muestra que siempre
puede sustituirse la herencia por composicin.
Patrones de diseo 21
Delegacin
Window
area()
Rectanguloanchoalto
area()
+rectangulo
return ancho * altoreturn rectangulo.area
Patrones de diseo 22
Ejercicio
Supuesto Eiffel, C++ o Java, seala tres formas de escribir una rutina de ordenacin de modo que la comparacin que usa para comparar no sea fija.
Patrones de diseo 23
A qu ayudan los patrones?
La clave para la reutilizacin es anticiparse a los nuevos requisitos y cambios, de modo que los sistemas evolucionen de forma adecuada.
Cada patrn permite que algunos aspectos de la estructura del sistema puedan cambiar independientemente de otros aspectos.
Facilitan reuso interno, extensibilidad y mantenimiento.
Patrones de diseo 24
Causas comunes de rediseo
i) Crear un objeto indicando la clase.ii) Dependencia de operaciones especficasiii) Dependencia de plataformas hardware o softwareiv) Dependencia sobre representacin de objetos.v) Dependencias de algoritmosvi) Acoplamiento fuerte entre clasesvii) Extender funcionalidad mediante subclasesviii) Incapacidad de cambiar clases convenientemente
Patrones de diseo 25
Patrones frente a esos peligros
i) Abstract factory, Method factory, Prototypeii) Chain of Responsability, Commandiii) Abstract factory, Bridgeiv) Abstract factory, Bridge, Memento, Proxy,v) Builder, Iterator, Strategy, Template Method, Visitorvi) Abstract factory, Bridge, Chain of Responsability, Command,
Facade, Mediator, Observervii) Bridge, Chain of Responsability, Composite, Decorator,
Observer, Strategyviii) Adapter, Decorator, Visitor
Patrones de diseo 26
Cmo seleccionar un patrn?
Considera de que forma los patrones resuelven problemas de diseo
Lee la seccin que describe el propsito de cada patrn
Estudia las interrelaciones entre patrones Analiza patrones con el mismo propsito Examina las causas de redisear Considera que debera ser variable en tu diseo
Patrones de diseo 27
Cmo usar un patrn?
Lee el patrn, todos sus apartados, para coger una visin global.
Estudia la Estructura, Participantes y Colaboraciones Mira el ejemplo de cdigo Asocia a cada participante del patrn un elemento
software de tu aplicacin. Implementa las clases y mtodos relacionados con el
patrn.
Patrones de diseo 28
Patrones de Creacin
Abstraen el proceso de creacin de objetos. Ayudan a crear sistemas independientes de
cmo los objetos son creados, compuestos y representados.
Dos tipos: Clase: usa herencia para variar la clase que es
instanciada Objeto: delega instanciacin a otro objeto
Patrones de diseo 29
Patrones de Creacin
Se encapsula: qu clases concretas usa el sistema cmo se crean las instancias de esas clases
El sistema conoce las clases abstractas Flexibilidad en qu se crea, quin lo crea, cmo se
crea y cundo se crea.
30
Ejemplo: Laberinto
Muro
entrar()
PuertaestaAbierta
entrar()
Laberinto
addHabitacion()numHabitacion()
Sitio
entrar()
Habitacionnumero
entrar()getLado()setLado()
+lados
public class JuegoLaberinto {public Laberinto MakeLaberinto () {
Laberinto unLab = new Laberinto();Habitacion h1 = new Habitacion(1);Habitacion h2 = new Habitacion(2);Puerta unaPuerta = new Puerta(1,2)
unLab .addHabitacion (h1);unLab .addHabitacion (h2);
h1.setLado(Norte, new Muro());h1.setLado(Sur, new Muro());h1.setLado(Este, new Muro());h1.setLado(Oeste,unaPuerta);
h2.setLado(Norte, new Muro);return unLab;}
}
Patrones de diseo 32
Ejemplo: Laberinto
Poco Flexible: diseo laberinto cableado Cmo crear laberintos con otros tipos de
elementos como habitacionesEncantadas o puertasQueEscuchan?
Patrones de creacin permiten eliminar referencias explcitas a clases concretas desde el cdigo que necesita crear instancias de esas clases.
Patrones de diseo 33
Abstract Factory (Factora Abstracta)
Propsito Proporcionar una interfaz para crear familias de
objetos relacionados o dependientes sin especificar la clase concreta
Motivacin Un toolkit interfaz de usuario que soporta diferentes
formatos: Windows, Motif, X-Windows,..
MotivacinWidgetFactory
createScroolBar()CreateWindow()
MotifWidgetFactory
createScroolBar()createWindow()
PMWidgetFactory
createScroolBar()createWindow()
PMWindow
ScrollBar
PMScroolBar MotifScroolBar
Window
MotifWindow
Cliente
Abstract Factory
EstructuraAbstractFactory
CreateProductA()CreateProductB()
ConcreteFactory1
createProductA()createProductB()
ConcreteFactory2
createProductA()createProdcutB()
ProdA2
AbstrProdB
ProdB2 ProdB1
AbstrProdA
ProdA1
Cliente
Abstract Factory
Patrones de diseo 36
Abstract Factory
Aplicabilidad Un sistema debera ser independiente de cmo sus
productos son creados, compuestos y representados Un sistema debera ser configurado para una familia de
productos. Una familia de objetos productos relacionados es
diseada para ser utilizado juntos y se necesita forzar la restriccin.
Se quiere proporcionar una librera de clases de productos y se quiere revelar slo la interfaz, no la implementacin.
Patrones de diseo 37
Abstract Factory
Consecuencias Aisla a los clientes de las clases concretas de
implementacin. Facilita el intercambio de familias de productos. Favorece la consistencia entre productos Es difcil soportar nuevas clases de productos.
Patrones de diseo 38
Abstract Factory
Implementacin Factoras como singleton. Se necesita una subclase de AbstractFactory por cada
clase de producto que redefine un mtodo factora. Posibilidad de usar el patrn Prototype.
Definir factoras extensibles: AbstractFactory slo necesita un mtodo de creacin.
Patrones de diseo 39
Ejemplo: Laberinto
public class FactoriaLaberinto {public Laberinto makeLaberinto { return new Laberinto();}public Muro makeMuro {return new Muro();};public Habitacion makeHabitacion(int n)
{ return new Habitacion(n); };public Puerta makePuerta (Habitacion h1, Habitacion h2)
{return new Puerta(h1,h2);}}
public class JuegoLaberinto {public Laberinto makeLaberinto (FactoriaLaberinto factoria) {
Laberinto unLab = factoria.makeLaberinto();Habitacion h1 = factoria.makeHabitacion(1);Habitacion h2 = factoria.makeHabitacion(2);Puerta unaPuerta = factoria.makePuerta(h1,h2);
unLab.addHabitacion(h1);unLab.addHabitacion(h2);
h1.setLado(Norte, factoria.makeMuro());h1.setLado(Este, unaPuerta)..h2.setLado(Oeste, unaPuerta);h2.setLado(Sur, factoria.makeMuro())return unLab; }
}
Patrones de diseo 41
Builder (Constructor)
Propsito Separa la construccin de un objeto complejo de su
representacin, as que el mismo proceso de construccin puede crear diferentes representaciones.
Motivacin Un traductor de documentos RTF a otros formatos. Es
posible aadir una nueva conversin sin modificar el traductor?
Motivacin
ASCIIConversor
convertirCaracter()getTextoASCII()
ConversorTeX
convertirCaracter()convertirCambioFont()convertirParrafo()getTextoTeX()
ConversorTexto
convertirCaracter()convertirCambioFont()ConvertirParrafo()
RTFTraductor
parseRTF()
TextoASCII TextoTeX
Builder
parseRTF {while (t = obtener siguiente token) {
switch(t.tipo) {case Car:
builder.convertirCaracter(t.char);break;case Font:
builder.convertirCambioFont(t.font);break;case Par:
builder.convertirParrafo(); break}
}}
44
Estructura
BuilderConcreto
buildParte()getResultado()
Director
Construir()
Builder
buildParte()
+builder
para todo objeto en estructura { builder.buildParte}
Producto
Builder
Patrones de diseo 45
Builder
Aplicabilidad Cuando el algoritmo para crear un objeto complejo
debe ser independiente de las piezas que conforman el objeto y de cmo se ensamblan.
El proceso de construccin debe permitir diferentes representaciones para el objeto que se construye.
Patrones de diseo 46
Builder
Consecuencias Permite cambiar la representacin interna del producto. Separa el cdigo para la representacin y para la
construccin. Los clientes no necesitan conocer nada sobre la estructura
interna. Diferentes directores pueden reutilizar un mismo
builder Proporciona un control fino del proceso de construccin.
Patrones de diseo 47
Builder
Implementacin La interfaz de Builder debe ser lo suficientemente
general para permitir la construccin de productos para cualquier Builder concreto.
La construccin puede ser ms complicada de aadir el nuevo token al producto en construccin.
Los mtodos de Builder no son abstractos sino vacos. Las clases de los productos no tienen una clase
abstracta comn.
Patrones de diseo 48
Ejemplo: Laberinto
public class BuilderLaberinto {public void buildLaberinto { };public void buildPuerta { };public void buildHabitacion(int n) { };public Laberinto getLaberinto() { };protected BuilderLaberinto() { };
}
public class JuegoLaberinto {public Laberinto makeLaberinto (BuilderLaberinto builder) {
builder.buildLaberinto();
builder.buildHabitacion(1);builder.buildHabitacion(2);builder.buildPuerta(1,2);
return builder.getLaberinto(); }}
class BuilderLaberintoNormal extends BuilderLaberinto {Laberinto labActual;// se define la construccin de un laberinto con determinado tipo de// puertas y habitaciones...
} Oculta la estructura interna
Patrones de diseo 50
Factory Method (Mtodo Factora)
Propsito Define un interfaz para crear un objeto, pero permite a
las subclases decidir la clase a instanciar: instanciacindiferida a las subclases.
Motivacin Una clase C cliente de una clase abstracta A necesita
crear instancias de subclases de A que no conoce. En un framework para aplicaciones que pueden
presentar al usuario documentos de distinto tipo: Clases Aplicacin y Documento.
Se conoce cundo crear un documento, no se conoce de qu tipo.
51
Motivacin
MiDocumento
Documento
open()close()save()revert()
Aplicacion
crearDocumento()nuevoDocumento()openDocumento()
MiAplicacion
crearDocumento()
return new MiDocumento
Documento dd = crearDocumento();
setDoc.add(d);d.open()
mtodo factoria
Factory Method
52
Estructura
Creador
metodoFactoria()unaOperacion()
ProductoConcretoCreadorConcreto
metodoFactoria()
Productos
Patrones de diseo 53
Factory Method
Aplicabilidad Una clase no puede anticipar la clase de objetos que debe
crear. Una clase desea que sus subclases especifiquen los
objetos que debe crear. Una clase delega responsabilidad a una entre varias
sublcases clases accesorias (helper) y se quiere localizar el conocimiento de en qu subclase helper se delega.
Patrones de diseo 54
Factory Method
Consecuencias Evita ligar un cdigo a clases especficas de la aplicacin. Puede suceder que las subclases de Creador slo se crean
con el fin de la creacin de objetos. Mayor flexibilidad en la creacin: subclases ofreciendo
versiones extendidas de un objeto. El mtodo factora puede ser invocado por un cliente, no
slo por la clase Creador: jerarquas paralelas
Patrones de diseo 55
Linea
crearManipulador()
Circulo
crearManipulador()
ManipuladorLinea ManipuladorCirculo
Manipulador
downClick()drag()upClick()
ClienteFigura
crearManipulador()
Factory Method
56
Factory Method
Implementacin Dos posibilidades
Creador es una clase abstracta con un mtodo factora abstracto.
Creador es una clase concreta que ofrece una implementacin por defecto del mtodo factora.
El mtodo factora puede tener un parmetro que identifica a la clase del objeto a crear.
Se evita crear subclases de Creador con: Metaclases (Smalltalk y Java) Genericidad (C++)
57
Factora y Metaclases
Factoria
crear(tipo : String) : Producto
P1 P2
Cliente
Producto
return (Producto) Class.forName(tipo).newInstance()
Patrones de diseo 58
Ejemplo: Laberinto
public class JuegoLaberinto {public Laberinto nuevoLaberinto () {...};
public Laberinto crearLaberinto() {return new Laberinto();};public Habitacion crearHabitacion(int n)
{return new Habitacion(n);};public Muro crearMuro() {return new Muro();};public Puerta crearPuerta(Habitacion h1, Habitacion h2)
{return new Puerta(h1,h2);};
}
public Laberinto nuevoLaberinto () {Laberinto unLab = crearLaberinto();Habitacion h1 = crearHabitacion(1);Habitacion h2 = crearHabitacion(2);Puerta unaPuerta = crearPuerta(h1,h2);
unLab.addHabitacion(h1);unLab.addHabitacion(h2);
h1.setLado(Norte, crearMuro);h1.setLado(Este, unaPuerta)..h2.setLado(Oeste, unaPuerta);h2.setLado(Sur, crearMuro)return unLab; }
}
Patrones de diseo 60
Prototype (Prototipo)
Propsito Especificar los tipos de objetos a crear utilizando una
instancia prototpica, y crear nuevas instancias mediante copias del prototipo.
Motivacin GraphicTool es una clase de un framework que permite
crear editores grficos, que crea objetos grficos, instancias de subclases de Graphic y los aade a un documento, cmo puede hacerlo si no sabe qu objetos grficos debe crear?
Motivacin
Prototype
p = prototipo.clone();while (usuario arrastra mouse) { p.draw(nuevapos) }
insertar p in dibujo
Tool
manipular()
Pentagrama
dibujar()clone()
NotaMusical
Entera
dibujar()clone()
Media
dibujar()clone()
Graphic
dibujar()clone()
GraphicTool
manipular()
+prototipo
return copy of self
Estructura
return copia de self
PrototipoConcr1
clone()
PrototipoConcr2
clone()
Cliente
operacion()
(from FactoryMethod) Prototipo
clone()
+prototipo
p = prototipo.clone()
Prototype
Patrones de diseo 63
Prototype
Aplicabilidad Cuando un sistema deba ser independiente de cmo sus
productos son creados, compuestos y representados y: las clases a instanciar son especificadas en tiempo de ejecucin. para evitar crear una jerarqua de factoras paralela a la de
productos. cuando las instancias de una clase slo pueden encontrarse en
uno de un pequeo grupo de estados. Inicializar un objeto es costoso
64
Prototype
Consecuencias Al igual que con Builder y Factory Abstract oculta al
cliente las clases producto concretas. Es posible aadir y eliminar productos en tiempo de
ejecucin: mayor flexibilidad que los anteriores. La composicin reduce el nmero de clases que es
necesario crear. Un objeto prototipo puede estar formado por otros
primitivos. Reduce la necesidad de crear subclases. Posibilidad de usar clases cargadas dinmicamente.
65
Prototype
Implementacin Importante en lenguajes que no soportan el concepto de
metaclase, as en Smalltalk o Java es menos importante. Usar un manejador de prototipos que se encarga del
mantenimiento de una tabla de prototipos. Implementar la operacin clone es lo ms complicado. A veces se requiere inicializar el objeto creado
mediante copia: prototipo con operaciones set.
Patrones de diseo 66
Ejemplo: Laberintopublic class FactoriaPrototipoLaberinto {
factoriaPrototipoLaberinto (Laberinto l, Puerta p, Habitacion h, Muro m);
{protoLab = l; protoPuerta = p; protoHab = h; protoMuro = m;}
public Laberinto makeLaberinto() {return (Laberinto)protoLab.clone()};public Muro makeMuro {return (Muro) protoMuro.clone() };public Habitacion makeHabitacion(int n) {
Habitacion h = (Habitacion) protoHab.clone(); h.initialize(n); return h;}
public Puerta makePuerta (Habitacion h1, Habitacion h2) {Puerta p = (Puerta) protoPuerta.clone();p.initialize(h1,h2); return p}
}
JuegoLaberinto juego;FactoriaPrototipoLaberinto LaberintoSimple =
new FactoriaPrototipoLaberinto (new Laberinto, new Puerta, new Habitacion, new Muro);
Laberinto unlab = juego. makeLaberinto(LaberintoSimple)
JuegoLaberinto juego;FactoriaPrototipoLaberinto otroLaberinto =
new FactoriaPrototipoLaberinto (new Laberinto, newPuertaQueOye, new HabitacionEncantada, new Muro);
Laberinto unlab = juego. makeLaberinto(otroLaberinto)
68
Factora Abstracta con Prototipo
// crea objetos de una jerarqua de productosclass Factoria {
private HashTable catalogo;public Producto getProducto(String s) {
return (Producto) ((Producto) catalogo.get(s)).clone();}public Factoria (String familia) {inicializa el catalogo}...
}
Patrones de diseo 69
Singleton
Propsito Asegurar que una clase tiene una nica instancia y
asegurar un acceso global
Motivacin Una nica instancia de la clase que maneja las ventanas,
o de un spooler de impresoras o de un sistema de ficheros o de una factora.
La clase se encarga de asegurar que exista una nica instancia y de su acceso.
70
Estructura
return unicaInstancia
SingletonunicaInstanciadatoSingleton
instancia()operacionSingleton()getSingleton()
Singleton
Singleton.instancia().operacionSingleton()
Patrones de diseo 71
Singleton
Aplicabilidad Debe existir una nica instancia de una clase, accesible
globalmente.
Consecuencias Acceso controlado a la nica instancia Evita usar variables globales Generalizar a un nmero variable de instancias La clase Singleton puede tener subclases.
72
Singleton Puede suceder que Singleton tenga subclases y el
cliente desee asociar a UnicaInstancia un objeto de una de las subclases. Anlisis de casos en instancia() Singleton maneja un registro de singleton
En Smalltalk con variables de clase instancia podemos conseguir que cada subclase tenga su propio singleton.
Singleton Implementacin Java
public class Singleton {public static Singleton instancia()
{ if (unicaInstancia = = null){unicaInstancia = new Singleton()};
return unicaInstancia};protected Singleton();private static Singleton unicaInstancia = null;
Implementacin Smalltalknew
self error: no se puede crear el objetodefault -- mtodo de clase
UnicaInstancia isNil ifTrue: [UnicaInstancia:= super new].^UnicaInstancia.
Patrones de diseo 74
Patrones estructurales
Cmo clases y objetos se combinan para formar estructuras ms complejas.
Patrones de clase Usan herencia (p.e. Adapter)
Patrones de objeto Describen formas de combinar objetos para obtener nueva
funcionalidad Posibilidad de cambiar la composicin en tiempo de
ejecucin. Ej.: Composite, Proxy
Patrones de diseo 75
Adapter / Wrapper (Adaptador)
Propsito Convertir la interfaz de una clase en otra que el cliente
espera. Permite la colaboracin de ciertas clases a pesar de tener interfaces incompatibles
Motivacin Un editor grfico incluye una jerarqua que modela
elementos grficos (lneas, polgonos, texto,..) y se desea reutilizar una clase existente TextView para implementar la clase que representa elementos de texto, pero que tiene una interfaz incompatible.
76
Motivacin
ElemLinea
marco()crearManipulador()
EditorElementoGrafico
marco()crearManipulador()
ElemTexto
marco()crearManipulador()
TextView
getExtension()
+texto
return text.getExtension
return new ManipuladorTexto
*
Adapter / Wrapper (Adaptador)
77
Estructura Adapter/Clase
Adaptado
especificoMet1()
Adaptador
metodo1()
especificoMet1
ClienteObjetivo
metodo1()
( )
78
Estructura Adapter/Objeto
Cliente Objetivo
metodo1()
Adaptador
metodo1()
Adaptado
especificoMet1()
+adaptado
adaptado. especificoMet1()
Patrones de diseo 79
Adapter
Aplicabilidad Se desea usar una clase existente y su interfaz no coincide
con la que se necesita: se quiere usar una clase que invoca a un mtodo a travs de una interfaz,
pero quiere usarse con otra clase que no implementa la interfaz
Se desea crear una clase reutilizable que debe colaborar con clases no relacionadas o imprevistas.
(slo adaptador-objeto) se necesita usar varias subclases y es incmodo adaptar su interfaz aplicando subclassing.
80
Adapter Consecuencias
Un adaptador-clase no funciona cuando queramos adaptar una clase y sus subclases.
Un adaptador-clase puede redefinir comportamiento heredado de Adaptado.
Un adaptador-clase no implica ninguna indireccin, slo introduce un objeto.
Un adaptador-objeto permite adaptar una clase y sus subclases, pudiendo aadir funcionalidad a todos los adaptados a la vez.
Para un adaptador-objeto es complicado redefinir comportamiento de Adaptado.
81
Adapter Consecuencias
La funcionalidad de Adaptador depende de la similitud entre la interfaz de las clases Objetivo y Adaptado.
Adaptores pluggable:
Clases que incorporan una adaptacin de interfaz
Cmo podemos conseguir que una clase reutilizable pueda incorporarse en sistemas existentes que esperan interfaces diferentes a la de la clase?
Ejemplo: Clase TreeDisplay para visualizar estructuras jerrquicas (widget), exige que los objetos a visualizar tengan una determinada interfaz, p.e. clase abstracta Tree?
82
Adapter
Implementacin En C++, la clase Adaptador hereda en modo privado de
Adaptado y en modo pblico de Objetivo. Tres posibles implementaciones de adaptadores
plugabbles: Con operaciones abstractas Con delegacin de objetos Adaptadores parametrizados
Adapter
TreeDisplay
getChildren(Node)CreateGraphicNode(Node)display()BuilTree(Node n)
DirectoryTreeDisplay
getChildren(Node)createGraphicNode(Node)
getChildren(n);for each child {
addGraphicNode(CreateGraphicNode(child));buildTree(child)
}
FileSystemEntity
adaptadoradaptado
Objetivo, Cliente
AdapterCliente
adaptadorDirectoryBrowser
getChildren()CreateGraphicNode()createFile()deleteFile()
FileSystemEntity
delegate.getChildren(this,n);for each children {
addGraphicNode(delegate.createGraphicNode(this,child));
buildTree(child)}
TreeDisplay
setDelegate(delegate)display()buildTree(Node n)
TreeAccesorDelegate
getChildren(TreeDisplay, Node)CreateGraphicNode(TreeDisplay, Node)
+delegate
Objetivo
adaptado
Patrones de diseo 85
Ejercicio
Supuesto el sistema de terminal de punto de venta, disea una solucin basada en los patrones vistos para que el sistema pueda soportar diferentes servicios externos de terceras partes para clculo de impuestos o autorizacin de pagos.
Patrones de diseo 86
Bridge / Handle Propsito
Desacoplar una abstraccin de su implementacin, de modo que los dos puedan cambiar independientemente.
Motivacin Clase que modela la abstraccin con subclases que la
implementan de distintos modos. Herencia hace difcil reutilizar abstracciones e
implementaciones de forma independiente Si refinamos la abstraccin en una nueva subclase, est tendr
tantas subclases como tena su superclase. El cdigo cliente es dependiente de la plataforma.
Patrones de diseo
Bridge / Handle
MotivacinImplementacin de una abstraccin window portable en una librera GUI.
XWindow
Window
PMWindow IconWindow
XIconWindowPMIconWindow
Window
XWindow PMWindow
Motivacin
IconWindow
mostrarBorde()
TransientWindow
mostrarCaja()
XWindowImp
devMostrarTexto()devMostrarLinea()
PMWindow
devMostrarLinea()devMostrarTexto()
WindowImp
devMostrarTexto()devMostrarLinea()
Window
mostrarTexto()mostrarRect()
+imp
mostrarRect()mostrarTexto() XmostrarTexto()
mostrarRect()mostrarTexto() XmostrarLinea()
imp.devMostrarLinea()imp.devMostrarLinea()imp.devMostrarLinea()imp.devMostrarLinea()
Bridge / Handle
89
Estructura
Bridge / Handle
AbstraccionRefinadaImplemA
operacionImp()
ImplemB
operacionImp()
Implementacion
operacionImp()
Abstraccion
operacion()
+imp
imp.operacionImp
Patrones de diseo 90
Bridge
Aplicabilidad Se quiere evitar una ligadura permanente entre una
abstraccin y su implementacin, p.e. porque se quiere elegir en tiempo de ejecucin.
Abstracciones e implementaciones son extensibles. Cambios en la implementacin de una abstraccin no
deben afectar a los clientes (no recompilacin). Ocultar a los clientes la implementacin de la interfaz. Se tiene una proliferacin de clases, como suceda en la
Motivacin.
Patrones de diseo 91
Bridge
Consecuencias Un objeto puede cambiar su implementacin en t.e. Cambios en la implementacin no motivarn
recompilaciones de la clase Abstraccin y sus clientes. Se mejora la extensibilidad Se ocultan detalles de implementacin a los clientes
Bridge Implementacin
Aunque exista una nica implementacin puede usarse el patrn para evitar que un cliente se vea afectado si cambia.
Cmo, cundo y dnde se decide que implementacin usar?
Constructor de la clase Abstraccion Elegir una implementacin por defecto Delegar a otro objeto, p.e. un objeto factora
Se puede usar herencia mltiple para heredar de la abstraccin y de una implementacin concreta, pero se liga una interface a una implementacin de forma permanente.
Patrones de diseo 93
Composite Propsito
Componer objetos en estructuras jerrquicas para representar jerarquas parte/todo. Permite a los clientes manejar a los objetos primitivos y compuesto de forma uniforme.
Motivacin Modelar figuras compuestas Modelar paquetes de valores (acciones, bonos,..)
94
Motivacin
Linea
dibujar()
Rectangulo
dibujar()
Figura
dibujar()add(Figura)remove(Figura)getHijo(int)
FiguraCompuesta
dibujar()add(Figura)remove(Figura)getHijo(int)
Composite
95
Estructura
Hoja
operacion()
Componente
operacion()add(Componente)remove(Componente)getHijo(int)
Composite
operacion()add(Componente)remove(Componente)getHijo(int)
Cliente
+hijos
Composite
Patrones de diseo 96
Composite
Aplicabilidad Se quiere representar jerarquas parte/todo Se quiere que los clientes ignoren la diferencia entre
objetos compuestos y los objetos individuales que los forman.
Patrones de diseo 97
Composite
Consecuencias Jerarqua con clases que modelan objetos primitivos y
objetos compuestos, que permite composicin recursiva. Clientes pueden tratar objetos primitivos y compuestos de
modo uniforme. Es fcil aadir nuevos tipos de componentes. No se puede confiar al sistema de tipos que asegure que
un objeto compuesto slo contendr objetos de ciertas clases, necesidad de comprobaciones en tiempo de ejecucin.
Composite Implementacin
Referencias de componentes hijos a su padre puede ayudar a el recorrido y manejo de la estructura compuesta.
Debe contener Componente operaciones que no tienen significado para sus subclases?
Dnde colocamos las operaciones de aadir y eliminar hijos?
Compromiso entre seguridad y transparencia. Transparencia: clase Componente Seguridad: clase hijo
Puede ser necesario especificar un orden en los hijos. Uso de cach. Qu estructura de datos es la adecuada?
Patrones de diseo 99
Decorator (Decorador)
Propsito Asignar dinmicamente nuevas responsabilidades a un
objeto. Alternativa ms flexible a crear subclases para extender la funcionalidad de una clase.
Motivacin Algunas veces se desea aadir atributos o comportamiento
adicional a un objeto concreto no a una clase. Ejemplo: bordes o scrolling a una ventana. Herencia no lo permite.
Motivacin
TextView
mostrar()
VisualComponente
mostrar()
Decorator
mostrar() +componente
ScrollDecoratorposicionScroll
mostrar()scrollTo()
BorderDecoratoranchoBorde
mostrar()mostrarBorde()
componente.mostrar
super.mostrar;mostrarBorde
Decorator (Decorador)
MotivacinunBorderDecorator
unScrollDecorator
unTextView
Decorator (Decorador)
Estructura
componente.operacion
CompConcreto
operacion()
Componente
operacion()
Decorator
operacion() +componente
DecoratorConcrAestadoAdicional
operacion()
DecoratorConcrBestadoAdicional
operacion()comportAdicional()
super.operacion;comportAdicional
Decorator (Decorador)
Patrones de diseo 103
Decorator (Decorador)
Aplicabilidad Aadir dinmicamente responsabilidades a objetos
individuales de forma transparente, sin afectar a otros objetos.
Responsabilidades de un objeto pueden ser eliminadas. Para evitar una explosin de clases que produce una
jerarqua inmanejable.
Decorator (Decorador)
Consecuencias Ms flexible que la herencia: responsabilidades pueden
aadirse y eliminarse en tiempo de ejecucin. Diferentes decoradores pueden ser conectados a un mismo
objeto. Reduce el nmero de propiedades en las clases de la parte
alta de la jerarqua. Es simple aadir nuevos decoradores de forma
independiente a las clases que extienden. Un objeto decorador tiene diferente OID al del objeto que
decora. Sistemas con muchos y pequeos objetos.
105
Decorator (Decorador)
Implementacin La interfaz de un objeto decorador debe conformar con la
interfaz del objeto que decora. Clases decorador deben heredar de una clase comn.
Componentes y decoradores deben heredar de una clase comn que debe ser ligera en funcionalidad.
Si la clase Componente no es ligera, es mejor usar el patrn Strategy que permite alterar o extender el comportamiento de un objeto.
Un componente no sabe nada acerca de sus decoradores, con Strategy sucede lo contrario.
106
Decorator (Decorador)
Implementacin El decorador enva los mensajes al componente que
decora, pudiendo extender la operacin con nuevo comportamiento.
Las clases que modelan los decoradores concretos pueden aadir responsabilidades a las que heredan de Decorator.
Patrones de diseo 107
Facade / Fachada Propsito
Proporciona una nica interface a un conjunto de interfaces de un subsistema. Define una interface de ms alto nivel que facilita el uso de un subsistema.
Motivacin Reducir las dependencias entre subsistemas. Un entorno de programacin que ofrece una librera de
clases que proporcionan acceso a su subsistema compilador: Scanner, Parser, ProgramNode, ByteCodeStream y ProgramNodeBuilder. Clase Compileracta como fachada.
EstructuraFachada
Patrones de diseo 109
Facade / Fachada
Aplicabilidad Proporcionar una interfaz simple a un subsistema. Hay muchas dependencias entre clientes y las clases que
implementan una abstraccin. Se desea una arquitectura de varios niveles: una fachada
define el punto de entrada para cada nivel subsistema.
Patrones de diseo 110
Facade / Fachada
Consecuencias Una fachada ofrece los siguientes beneficios:1) Facilita a los clientes el uso de un subsistema, al ocultar
sus componentes.2) Proporciona un acoplamiento dbil entre un subsistema y
los clientes: cambios en los componentes no afectan a los clientes.
3) No se impide a los clientes el uso de las clases del subsistema si lo necesitan.
111
Facade / Fachada
Implementacin Es posible reducir el acoplamiento entre clientes y
subsistema, definiendo la fachada como una clase abstracta con una subclase por cada implementacin del subsistema.
La fachada no es la nica parte pblica de un subsistema, sino que es posible declarar clases individuales del subsistema como pblicas (paquetes en Java, name spaceen C++).
Patrones de diseo 112
Flyweight
Propsito Uso de la comparticin para soportar eficientemente un
gran nmero de objetos de poco tamao
Motivacin En una aplicacin editor de documentos, modelamos los
caracteres mediante una clase? Un flyweight es un objeto compartido que puede ser
utilizado en diferentes contextos simultneamente. No hace asunciones sobre el contexto Estado intrnseco vs. Estado extrnseco
Patrones de diseo 113
Flyweight Estado intrnseco se almacena en el flyweight y
consiste de informacin que es independiente del contexto y se puede compartir.
Estado extrnseco depende del contexto y por tanto no puede ser compartido.
Objetos clientes son responsables de pasar el estado extrnseco al flyweight cuando lo necesita.
Flyweight se usan para modelar conceptos o entidades que son muy abundantes para representarse con objetos, p.e. caracteres de un texto.
Flyweight Flyweight carcter de un texto:
estado intrnseco: cdigo del carcter estado extrnseco: informacin sobre posicin y estilo
Caracterchar c
mostrar(contexto)intersec(point, contexto)
Fila
mostrar(contexto)intersec(point, contexto)
Elemento
mostrar(contexto)intersec(point, contexto)
+hijos
Columna
mostrar(contexto)intersec(point, contexto)
+hijos
EstructuraFlyweight
operacion(estadoExt)
FlyweightFactory
getFlyweight()
ClienteConcreto
estadoIntrinseco
operacion(estadoExt)
ConcretoSinCompartirtodoEstado
operacion(estadoExt)
Flyweight
Patrones de diseo 116
Flyweight
flyweight getFlyweight (key) {if (flyweight[key]) existe {return flyweight existente}else {crear nuevo flyweight;
aadirlo al conjunto de flyweight;return el nuevo flyweight}
}
Patrones de diseo 117
Flyweight
Aplicabilidad Aplicarlo siempre que se cumplan las siguientes
condiciones:1) Una aplicacin utiliza un gran nmero de objetos.2) El coste de almacenamiento es alto debido al excesivo
nmero de objetos.3) La mayor parte del estado de un objeto puede hacerse
extrnseco.4) Muchos grupos de objetos pueden reemplazarse por unos
pocos objetos compartidos al separar el estado extrnseco.5) La aplicacin no depende de la identidad de los objetos.
Patrones de diseo 118
Flyweight
Consecuencias Puede introducir costes run-time debido a la necesidad de
calcular y transferir el estado extrnseco. La ganancia en espacio depende de varios factores:
la reduccin en el nmero de instancias el tamao del estado intrnseco por objeto si el estado extrnseco es calculado o almacenado
Interesa un estado intrnseco calculado Se suele combinar con el Composite.
Patrones de diseo 119
Flyweight
Implementacin La aplicabilidad depende de la facilidad de obtener el
estado extrnseco. Idealmente debe poder calcularse a partir de una estructura de objetos que necesite poco espacio de memoria.
Debido a que los flyweight son compartidos, no deberan ser instanciados directamente por los clientes: clase FlyweightFactory.
Patrones de diseo 120
Proxy
Propsito Proporcionar un sustituto (surrogate) de un objeto para
controlar el acceso a dicho objeto.
Motivacin Diferir el coste de crear un objeto hasta que sea necesario
usarlo: creacin bajo demanda. Un editor de documentos que incluyen objetos grficos. Cmo ocultamos que una imagen se crear cuando se
necesite?: manejar el documento requiere conocer informacin sobre la imagen.
Motivacin
EditorDocumentos
Grafico
dibujar()getExtension()store()load()
ProxyImagennombreFichextension
dibujar()getExtension()store()load()
ImagenimpImagenextension
dibujar()getExtension()store()load()
+imagen
if (image == null) {image = loadImage(nombreFich)}else {imagen. dibujar()}
if (imagen == null) { return extension}else {imagen.getExtension}
Proxy
122
EstructuraCliente(from flyweight)
Sujeto
operacion()
Proxy
operacion()
SujetoReal
operacion() +sujeto
sujeto.operacion()
Proxy
Patrones de diseo 123
Proxy
Aplicabilidad Siempre que hay necesidad de referenciar a un objeto
mediante una referencia ms rica que una referencia normal. Situaciones comunes;1) Proxy acceso remoto (acceso a un objeto en otro espacio de
direcciones)2) Proxy virtual (crea objetos grandes sobre demanda)3) Proxy para proteccin (controlar acceso a un objeto)4) Referencia inteligente (smart reference)
Patrones de diseo 124
Proxy
Consecuencias Introduce un nivel de indireccin para:1) Un proxy remoto oculta el hecho que objetos residen en
diferentes espacios de direcciones.2) Un proxy virtual tales como crear o copiar un objeto bajo
demanda.3) Un proxy para proteccin o las referencias inteligentes
permiten realizar tareas de control sobre los objetos accedidos.
Patrones de diseo 125
Proxy
Implementacin Sobrecargar el operador de acceso a miembros (->) en
C++. En Smalltalk, posibilidad de definir Proxy como una clase
que hereda de nil (no comprende ningn mensaje) y redefinir doesNotUnderstand para redirigir los mensajes al objeto sujeto.
Puede suceder que baste con definir una nica clase Proxypara todos los tipos de sujetos.
Patrones de diseo 126
Patrones de comportamiento
Relacionados con la asignacin de responsabilidades entre clases.
Describen no solo patrones de clases y objetos, sino tambin patrones de colaboracin entre objetos.
Caracterizan un flujo de control ms o menos complejo que ser transparente al que utilice el patrn.
Patrones de clase: Template Method e Interpreter Patrones de objeto: Mediator, Observer,..
Patrones de diseo 127
Chain of Responsibility (Cadena de Responsabilidad)
Propsito Evita acoplar el emisor de un mensaje a su receptor
dndole a ms de un objeto la posibilidad de manejar la solicitud. Se define una cadena de objetos, de modo que un objeto pasa la solicitud al siguiente en la cadena hasta que uno la maneja.
Motivacin Facilidad de ayuda sensible al contexto. El objeto que proporciona la ayuda no es conocido al
objeto (p.e. Un Button) que inicia la solicitud de ayuda.
128
Chain of Responsibility
Motivacin
Aplicacion1 Widget
Dialog Button
manejarAyuda()mostrarAyuda()
manejador.manejarAyuda
if puedo manejar { mostrarAyuda() }else { super manejarAyuda() }
ManejadorAyuda
manejarAyuda()
+manejador
Patrones de diseo 129
Chain of Responsibility
printBoton : But ton
OKBoton : But ton
printDialogo : Dialog
GuardarDialogo : Dialog
: Aplicacion
130
Estructura
Manejador
manejarSolicitud()
+sucesorCliente(from FactoryMethod)
ManejadorConcr1
manejarSolicitud()
ManejadorConcr2
manejarSolicitud()
Chain of Responsibility
Patrones de diseo 131
Chain of Responsibility
Aplicabilidad Ms de un objeto puede manejar una solicitud, y el
manejador no se conoce a priori. Se desea enviar una solicitud a uno entre varios objetos sin
especificar explcitamente el receptor. El conjunto de objetos que puede manejar una solicitud
puede ser especificado dinmicamente.
Patrones de diseo 132
Chain of Responsibility
Consecuencias Reduce acoplamiento Proporciona flexibilidad al asignar responsabilidades No se garantiza el manejo de la solicitud
Patrones de diseo 133
Chain of Responsibility
Implementacin Dos posibles formas de implementar la cadena
Definir nuevos enlaces (en Manejador) Usar enlaces existentes (p.e. un objeto composite)
class ManejadorAyuda {public ManejadorAyuda (ManejadorAyuda s) {sucesor = s};public void ManejarAyuda () {if sucesor != null {
sucesor.manejarAyuda;};};private ManejadorAyuda sucesor;
}
Patrones de diseo 134
Chain of Responsibility Implementacin
Qu sucede si tenemos diferentes tipos de solicitudes?
En Manejador un mtodo para cada solicitud En el caso de Java, una interfaz por solicitud En Manejador un nico mtodo con un parmetro que
representa el tipo de solicitud, por ejemplo un String. En Manejador un nico mtodo que tiene un
parmetro de una clase Solicitud que representa la solicitud.
Patrones de diseo 135
Recursion OO
Una variante del patrn es que un objeto de la cadena pueda realizar parte del trabajo antes de pasar la solicitud al siguiente objeto: Recursin OO
En Recursin OO no se est interesado en la organizacin de la cadena de objetos, slo que una estructura puede recorrerse.
Patrones de diseo 136
Recursion OO
Persona >> = unaPersona^self nombre = unaPersona nombre
NombrePersona >> = unaPersona^ (self nombre = unaPersona nombre)
and: [self apellidos = unaPersona apellidos]
String >> = aString...
Patrones de diseo 137
Chain of Responsibility
Ejemplo 1: Java 1.0 AWT Mecanismo de delegacin de eventos: Un evento es
pasado al componente donde ocurre que puede manejarlo o lo pasa a su contenedor.
Ejemplo 2: Sistema de control de seguridad Existen varios sensores que transmiten el estado a un
ordenador central. La accin de un sensor depende del contexto que lo incluye (jearqua de reas o zonas de seguridad). Un sensor pasa el evento al agregado que lo icnluye.
Patrones de diseo 138
Command
Propsito Encapsula un mensaje como un objeto, permitiendo
parametrizar los clientes con diferentes solicitudes, aadir a una cola las solicitudes y soportar funcionalidad deshacer/rehacer (undo/redo)
Motivacin Algunas veces es necesario enviar mensaje a un objeto sin
conocer el selector del mensaje o el objeto receptor. Por ejemplo widgets (botones, mens,..) realizan una
accin como respuesta a la interaccin del usuario, pero no se puede explicitar en su implementacin.
139Motivacin
MenuItem
clicked()
Command
ejecutar()
+command
Cut
execute()command.execute()
Menu
add(MenuItem)
Aplicacion2
add(Document)
Document
open()close()cut()copy()paste()
Paste
execute()
+document
document.paste
Command
140
Estructura
Cliente1Command
ejecutar()
Invocador
Receptor
accion()
CommandConcretoestado
ejecutar()
+receptor
receptor.accion()
Command
141
Colaboracin
Command
r : Receptor : Cliente co : Command : Invocador
1. Command (r)
2. regist rarCommand(co)
3. ejecutar()
3.1. accion()
Patrones de diseo 142
Command
Aplicabilidad Parametrizar objetos por la accin a realizar (en lenguajes
procedurales con funciones Callback: funcin que es registrada en el sistema para ser llamada ms tarde; en C++ se puede usar punteros a funciones).
Especificar, aadir a un cola y ejecutar mensajes en diferentes instantes: un objeto Command tiene un tiempo de vida independiente de la solicitud original.
Soportar facilidad undo/redo. Recuperacin de fallos. Modelar transacciones
Patrones de diseo 143
Command Consecuencias
Desacopla el objeto que invoca la operacin del objeto que sabe cmo realizarla.
Cada subclase CommandConcreto especifica un par receptor/accion, almacenando el receptor como un atributo e implementando el mtodo ejecutar.
Objetos command pueden ser manipulados como cualquier otro objeto.
Se pueden crear command compuestos (aplicando el patrn Composite).
Es fcil aadir nuevos commands.
Patrones de diseo 144
Command
Implementacin Cul debe ser la inteligencia de un command?
No delegar en nadie Encontrar dinmicamente el objeto receptor y delegar en l
Soportar undo/redo Atributos para almacenar estado y argumentos de la
operacin. Lista de objetos commands En la lista se colocan copias.
Patrones de diseo 145
Command Implementacin
Un objeto Command es realmente un Adapter: Commandplugabble.
Podemos evitar la jerarqua de subclases de Command si no necesitamos la facilidad undo/redo. En Smalltalk,
self receptor perform: unSelector with: unArg
Es posible asociar a un command ms de una accin (evento en un widget).
Patrones de diseo 146
Command Ejemplo 1: Comparar dos objetos utilizando cualquier
criterio de ordenacin: interface Comparator en Javapublic interface Comparator {
int compare (Object o1, Object o2); }
Un objeto Comparator puede pasado a una rutina de ordenacin o ser utilizado por una coleccin para mantener el orden de sus elementos.
Ejemplo 2: Interfaz Observer en el patrn Observer.
Patrones de diseo 147
Interpreter
Propsito Dado un lenguaje, definir una representacin para su
gramtica junto con un intrprete que utiliza la representacin para interpretar sentencias en dicho lenguaje.
Motivacin Interpretar una expresin regular. Usa una clase para representar cada regla, los smbolos en la
parte derecha son atributos. Usar si la gramtica es simple y la eficiencia no es
importante.
Patrones de diseo 148
Interpreter
Estructura
Cliente3
Contexto
ExpresionTerminal
interpretar(Contexto)
ExpresionAbstracta
interpretar(Contexto)
ExpresionNoTerminal
interpretar(Contexto)
149
Iterator (Iterador)
Propsito Proporciona una forma para acceder a los elementos de
una estructura de datos sin exponer los detalles de la representacin.
Motivacin Un objeto contenedor tal como una lista debe permitir una
forma de recorrer sus elementos sin exponer su estructura interna.
Debera permitir diferentes mtodos de recorrido Debera permitir recorridos concurrentes No queremos aadir esa funcionalidad a la interfaz de la
coleccin
150
Iterator (Iterador)
Motivacin Una clase Iterator define la interfaz para acceder a una
estructura de datos (p.e. una lista). Iteradores externos vs. Iteradores internos. Iteradores externos: recorrido controlado por el cliente Iteradores internos: recorrido controlado por el iterador
Patrones de diseo 151
Iterador Externo
ListIterator
first()next()hasNext()item()index()
Lista
count()append()remove()
+list
Patrones de diseo 152
Iterador Externo
List list = new List();...ListIterator iterator = new ListIterator(list);
iterator.first();while (!iterator.isDone()) {
Object item = iterator.currentItem();// cdigo para procesar itemiterator.next();
}...
Patrones de diseo 153
Iteradores Externos en Java
interface Iterator {boolean hasNext();Object next();void remove();
}Iterator it = lista.iterator();while (it.hasNext()) {
Object item = it.next();// cdigo para procesar item
}
Patrones de diseo 154
Iterador Externo Polimrfico
ListaAbstracta
crearIterador()count()append()remove()
Lista
Cliente
Iterator
first()next()isDone()CurrentItem()
ListIterator
Iterador Interno
ListaAbstracta
count()append()remove()
Iterator
doAll()doIf()action()test()
Lista
IteradorLista
action()test()doAll()doIf()
IteradorConcreto
action()test()
Cliente
Patrones de diseo 156
Iterador Interno
public void doIf() {iterator.first();while (!iterator.isDone()) {
Object item = iterator.currentItem();if (test(item)) action(item)
iterator.next();}
}
Patrones de diseo 157
Iterator
Consecuencias Simplifica la interfaz de un contenedor al
extraer los mtodos de recorrido Permite varios recorridos, concurrentes Soporta variantes en las tcnicas de recorrido
Patrones de diseo 158
Mediator
Propsito Define un objeto que encapsula como interaccionan un
conjunto de objetos. Favorece un bajo acoplamiento, liberando a los objetos de referenciarse unos a otros explcitamente, y permite variar la interaccin de manera independiente.
Motivacin Muchas interconexiones entre objetos dificulta la
reutilizacin y la especializacin del comportamiento. Ventana que incluye un conjunto de elementos grficos
con dependencias entre ellos.
159
Motivacin
ListBox
getSelection()
FontDialogDirector
createWidgets()widgetChanged(Widget)
+list EntryField
setText()
+field
director.WidgetChanged(this)
DialogDirector
showDialog()createWidgets()widgetChanged(Widget)
Widget
changed()
(from Logical View)+director
Mediator
160
Mediator
Motivacin:Cliente :FontDialogDirector :ListBox :EntryField
showDialog
widgetChanged
setText
getSelection
161
Estructura
Mediator
Colega+mediator
ColegaConcr1MediatorConcreto ColegaConcr2
Mediator
Patrones de diseo 162
Mediator
Aplicabilidad Un conjunto de objetos se comunica entre s de una forma
bien definida, pero compleja. Las interdependencias son poco estructuradas y difciles de comprender.
Reutilizar una clase es difcil porque tiene dependencias con muchas otras clases.
Un comportamiento que es distribuido entre varias clases debera ser adaptable sin crear subclases.
Patrones de diseo 163
Mediator
Consecuencias Evita crear subclases Desacopla a los colegas. Simplifica los protocolos entre las clases Abstrae el cmo cooperan los objetos Centraliza el control en el mediador: clase difcil de
mantener
Patrones de diseo 164
Mediator
Implementacin No hay necesidad de definir una clase abstracta Mediator
si los colegas trabajan con un nico mediador. Los colegas deben comunicarse con el mediador cuando
un evento de inters ocurre, varias posibilidades: patrn Observer interfaz de notificacin especializada en Mediator
(Smalltalk-V): clase ViewManager
Patrones de diseo 165
Memento
Propsito Captura y exterioriza el estado interno de un objeto, sin
violar la encapsulacin, de modo que el objeto puede ser restaurado a este estado ms tarde.
Motivacin Algunas veces es necesario registrar el estado interno de
un objeto: mecanismos checkpoints y deshacer cambios que permiten probar operaciones o recuperacin de errores.
Mecanismo de transacciones
166
Estructura
Memento
Creatorestado
setMemento(Memento)CrearMemento()
Mementoestado
getEstado()setEstado()
Guardian+memento
return new Memento(estado) estado = m. getEstado
167
Colaboracin
Memento
: Guardian : Creador m : Memento
1. crearMemento()1.1. new
1.2. setEstado()
2. setMemento(m)2.1. getEstado()
Patrones de diseo 168
Memento
Aplicabilidad Una parte del estado de un objeto debe ser guardado para
que pueda ser restaurado ms tarde.
Una interfaz para obtener el estado de un objeto podra romper la encapsulacin exponiendo detalles de implementacin.
Patrones de diseo 169
Memento
Consecuencias Mantiene la encapsulacin Simplifica la clase Creador ya que no debe preocuparse
de mantener las versiones del estado interno. Podra incurrir en un considerable gasto de memoria:
encapsular y restaurar el estado no debe ser costoso. Puede ser difcil en algunos lenguajes asegurar que slo el
Creador tenga acceso al estado del Memento.
Patrones de diseo 170
Memento
Implementacin Memento tiene dos interfaces, una para los creadores y
otra para el resto de clases: clase amiga (C++), exportacin selectiva (Eiffel).
Un memento puede registrar cambio incremental sobre el estado del creador: cuando se usa el patrn Commandpara el mecanismo undo/redo.
Patrones de diseo 171
Observer / Publish-Subscribe
Propsito Define una dependencia uno-a-muchos entre objetos, de
modo que cuando cambia el estado de un objeto, todos sus dependientes automticamente son notificados y actualizados.
Motivacin Cmo mantener la consistencia entre objetos
relacionados, sin establecer un acoplamiento fuerte entre sus clases?
Ejemplo: Separacin Modelo-Vista
0102030405060708090
1er trim. 2do trim. 3er trim. 4to trim.
EsteOesteNorte
1tr3tr
4tr2tr
1tr. 2tr. 3tr. 4tr.Este 20 25 90 20Oeste 30 38 32 32Norte 47 47 45 45
Vistas
t1=20t2=25t3=90t4=20
Modelo
Motivacin
173
ObserverEstructura
Observer
Update()
Subject
subjectState
Attach()Detach()Notify()
1..*1..1 1..*
+observers
1..1
ConcreteSubject
subjectState
getState()setState()
ConcreteObserver
observerState
update()
+subject
observerState=subject->getState()
for all o in observers{o->update()}
174
Observer
Colaboracin : Subject o1 : Observer o2 : Observer : Otra
1. setEstado()
1.1. notify()1.1.1. update()
1.1.2. update()
Patrones de diseo 175
Observer
Aplicabilidad Cuando un cambio de estado en un objeto requiere cambios
en otros objetos, y no sabe sobre cuntos objetos debe aplicarse el cambio.
Cuando un objeto debe ser capaz de notificar algo a otros objetos, sin hacer asunciones sobre quines son estos objetos.
Patrones de diseo 176
Observer
Consecuencias Permite modificar independientemente subjects y
observers. Acoplamiento abstracto y mnimo entre Subject y
Observer: puede reutilizarlos por separado observers pueden aadirse sin modificar el subject Subject no necesita conocer las clases concretas de
Observers
Patrones de diseo 177
Observer
Consecuencias Soporte para comunicacin de tipo broadcast:
el subject no especifica al receptor concreto de la notificacin
es posible aadir y eliminar observers en cualquier instante.
Actualizaciones inesperadas Interfaz de Observer simple requiere que los
observers tengan que deducir el item cambiado
Patrones de diseo 178
Observer
Implementacin Es posible que un observer est ligado a ms de un
subject: la operacin update tendr como argumento el subject.
Quin dispara la notificacin? Mtodos set en la clase Subject Clientes de la clase Subject
Asegurarse de notificar siendo el estado de Subjectconsistente
Cunta informacin sobre el cambio se le enva a los observers con la notificacin?
Modelo Push (Mucha) y Modelo Pull (Muy Poca)
Patrones de diseo 179
Observer
Implementacin Al registrar un observer es posible asociarle el evento
sobre el que quiere ser notificado
attach(Observer obs, Evento interes);
Cuando las relaciones de dependencia entre Subject y Observer son complicadas encapsular la semntica de actualizacin en una clase ManejadorCambio (Mediador).
En Smalltalk, las interfaces de las clases Subject y Observer se definen en la clase Object.
Patrones de diseo 180
Observer en Javapublic class Observable {
private boolean changed = false;private Vector obs;public Observable() {
obs = new Vector();}public synchronized void addObserver (Observer o) {..}public synchronized void deleteObserver (Observer o) {..}public void notifyObservers (Object arg) {..}protected synchronized void setChanged() {..}protected synchronized void clearChanged() {..}public synchronized boolean hasChanged() {.. }
Patrones de diseo 181
Observer en Java
public interface Observer {void update (Observable o, Object arg);
}Argumento pasado al
mtodo notifyObservers, puede indicar el tipo de
cambio
Patrones de diseo 182
Observer en Java
Problema Que la clase que deseamos que acte como
Observable ya herede de otra clase: En Java no hay herencia mltiple!
Usar delegacin Una clase ConcreteSubject contendr a un objeto de
una clase que heredar de Observable: implementaaddObserver y deleteObserver e invoca anotifyObservers()
Se delega el comportamiento que necesita ConcreteSubject al objeto Observable que contiene.
Por qu una subclase de Observable?
Patrones de diseo 183
Modelo de Eventos de Java 1.1
Java 1.1 introdujo un nuevo modelo de eventos para GUI basado en el patrn Observer.
Componentes GUI que pueden generar eventos son llamados fuentes de eventos (event sources).
Objetos que desean ser notificados de eventos GUI son llamados oyentes de eventos (event listeners).
Una fuente juega el papel de ConcreteSubject y un listener juega el papel de ConcreteObserver.
Los listeners deben registrarse en las fuentes.
Patrones de diseo 184
Modelo de Eventos de Java 1.1
Un listener debe implementar una interfaz que proporciona los mtodos que deben ser llamados por la fuente cuando ocurre el evento.
Hay 11 interfaces listener cada una apropiada para un diferente tipo de evento GUI: ActionListener, ItemListener, KeyListener,
MouseListener, WindowListener, ... En algunos casos la interfaz listener incluye ms de
un mtodo: Java proporciona adaptadores
Patrones de diseo 185
State (Estado)
Propsito Permite a un objeto cambiar su comportamiento cuando
cambia su estado. El objeto parece cambiar de clase.
Motivacin Una conexin TCP puede encontrarse en uno de varios
estados, y dependiendo del estado responder de un modo diferente a los mensajes de otros objetos para solicitudes tales como abrir, cerrar o establecer conexin.
186
State
Motivacin
TCPEstablished
open()close()acknowledge()
TCPListen
open()close()acknowledge()
TCPClosed
open()close()acknowledge()
TCPState
open()close()acknowledge()
TCPConexion
open()close()acknowledge()
+state
state.acknowledge()
187
State
Estructura
StateConcr1
operacion()
StateConcr2
operacion()
State
operacion()
Context
solicitud()
+state
state.operacion()
Patrones de diseo 188
State
Aplicabilidad El comportamiento del objeto depende de su estado, y debe
cambiar su comportamiento en tiempo de ejecucin dependiendo de su estado.
Las operaciones tienen grandes estructuras CASE que dependen del estado del objeto, que es representado por uno o ms constantes de tipo enumerado.
Patrones de diseo 189
State
Consecuencias Coloca todo el comportamiento asociado a un particular
estado en una clase. Subclases vs. Sentencias CASE. Ayuda a evitar estados inconsistentes Transiciones de estado son ms explcitas. Incrementa el nmero de objetos Los objetos State pueden ser compartidos.
Patrones de diseo 190
State
Implementacin Quin define las transiciones entre estados? Context o
subclases estado. Una alternativa es definir tablas que representan la matriz
de transiciones de estado: no es posible asociar acciones a los cambios de estado y ms difcil de comprender.
Cundo son creados los objetos estado? Pueden crearse cuando se necesiten o con antelacin y que Context tenga una referencia a ellos.
Patrones de diseo 191
Strategy/Policy (Estrategia)
Propsito Define una familia de algoritmos, encapsula cada uno, y
permite intercambiarlos. Permite variar los algoritmos de forma independiente a los clientes que los usan
Motivacin Existen muchos algoritmos para justificacin de texto,
debe implementarlo el cliente que lo necesita?
192
Strategy
Motivacin
JustificacionSimple
justificar()
JustificacionTeX
justificar()
algoJustif.justificar
Justificacion
justificar()
Composicion
recorrer()formato()
+algoJustif
193
Strategy
Estructura
EstrategiaA
algoritmoInterface()
EstrategiaB
algoritmoInterface()
Estrategia
algoritmoInterface()
Contexto
InterfaceContexto()
+estrategia
Patrones de diseo 194
Strategy
Aplicabilidad Configurar una clase con uno de varios comportamientos
posibles. Se necesitan diferentes variantes de un algoritmo. Una clase define muchos comportamientos que aparecen
como sentencias CASE en sus mtodos.
Patrones de diseo 195
Strategy
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 nmero de objetos: usar Flyweight State y Strategy son similares, cambia el Propsito:
ejemplos de composicin con delegacin
Patrones de diseo 196
Strategy
Implementacin Cmo una estrategia concreta accede a los datos del
contexto? Pasar datos como argumentos Pasar el contexto como argumento Estrategia almacena una referencia al contexto
Patrones de diseo 197
Template Method (Mtodo Plantilla)
Propsito Define el esqueleto (esquema, patrn) de un algoritmo en
una operacin, difiriendo algunos pasos a las subclases. Permite a las subclases redefinir ciertos pasos de un algoritmo sin cambiar la estructura del algoritmo.
Motivacin Fundamental para escribir cdigo en un framework. Clase Aplicacin que maneja objetos de la clase
Documento: mtodo OpenDocument
Patrones de diseo 198
Template Method
void openDocument (String name) {if (! canOpenDocument(nombre){return};Document doc = openDocument();if !(doc = null) {
docs. addDocument(doc);aboutToOpenDocument (doc);doc.open;doc.read();
}}
Patrones de diseo 199
Template Method
has(v:G): Boolean is dofrom start until after or else equal(v,item)loop forth endResult := not after
end
Patrones de diseo 200
Template Method
Aplicabilidad Implementar las partes fijas de un algoritmo y dejar que
las subclases implementen el comportamiento que puede variar.
Cuando el comportamiento comn entre varias subclases debe ser factorizado y localizado en una superclase comn.
Controlar extensiones de las subclases: algoritmos con puntos de extensin
Patrones de diseo 201
Template Method Consecuencias
Tcnica fundamental para la reutilizacin: factorizar comportamiento comn en libreras de clases
Estructura de control invertida conocida como Principio de Hollywood: No nos llames, nosotros te llamaremos.
Un mtodo plantilla (template) invoca a los siguientes tipos de mtodos:
operaciones concretas en la subclase concreta o en clientes operaciones concretas en la clase abstracta operaciones abstractas (primitivas) mtodos factora mtodos hook que proporcionan comportamiento por defecto
Patrones de diseo 202
Template Method
Implementacin Minimizar el nmero de mtodos que es necesario
redefinir en las subclases. Nombrar a los mtodos que se deben redefinir
aadindole cierto prefijo, p.e. do. En C++, mtodos a redefinir son protegidos y virtuales, el
mtodo plantilla no ser virtual.
Patrones de diseo 203
Visitor
Propsito Representa una operacin que debe ser aplicada sobre los
elementos de una estructura de objetos. Permite definir una nueva operacin sin cambiar las clases de los elementos sobre los que opera.
Motivacin Un compilador que representa los programas como rboles
de derivacin de la sintaxis abstracta necesita aplicar diferentes operaciones sobre ellos: comprobacin de tipos, generacin de cdigo, listados cdigo fuente, reestructuracin de programas,...
204
Visitor
MotivacinNodo
comprobarTipo()generarCodigo()prettyPrint()
NodoVariableRef
comprobarTipo()generarCodigo()prettyPrint()
NodoAsignacion
comprobarTipo()generarCodigo()prettyPrint()
205
Visitor
Motivacin
NodoVariableRef
aceptar(VisitorNodo v)
NodoAsignacion
Aceptar(VisitorNodo v)
Nodo
aceptar(VisitorNodo v)
Programa
v.visitarVariableRef(this) v.visitarAsignacion(this)
206
Visitor
MotivacinVisitorNodo
visitarAsignacion(NodoAsignacion)visitarVariableRef(NodoVariableRef)
VisitorComprobacionTipos
visitarAsignacion(NodoAsignacion)visitarVariableRef(NodoVariableRef)
VisitorGeneracionrCodigo
visitarAsignacion(NodoAsignacion)visitarVariableRef(NodoVariableRef)
Patrones de diseo 207
Visitor Aplicabilidad
Tenemos una jerarqua de clases que representan objetos de propsito general (p.e. nodos de un rbol de derivacin de sintaxis) y podemos utilizarlo en diferentes aplicaciones, lo que implicara aadir mtodos en las clases de la jerarqua.
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.
Patrones de diseo 208
Visitor
Consecuencias Facilidad para aadir nuevas operaciones: en vez de
distribuir la funcionalidad, se aade un nuevo visitor. Un visitor recoge comportamiento relacionado, lo que
simplifica las clases de los elementos. Es difcil aadir nuevas subclases de elementos concretos,
ya que implica cambiar la jerarqua de Visitor. A diferencia de un iterador, Visitor puede visitar objetos
de clases que no tienen una superclase comn. Compromete la encapsulacin: los elementos concretos
deben permitir a los visitors hacer su trabajo.
Patrones de diseo 209
Visitor
Implementacin El patrn permite aadir operaciones a clases sin
cambiarlas. Esto se consigue aplicando la tcnica double-dispatch.
Quin es responsable del recorrido de la estructura de objetos?
Estructura de objetos Un iterador El visitor
Patrones de diseo 210
Double-Dispatch
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)
Patrones de Diseo ContenidosArquitectura software y patronesDiseo orientado a objetosPatronesGranularidadPatrones y frameworksModelo-Vista-ControlModelo-Vista-ControlPlantilla de definicinPlantilla de definicinPlantilla de definicinClasificacinA qu ayudan los patrones?A qu ayudan los patrones?A qu ayudan los patrones?A qu ayudan los patrones?A qu ayudan los patrones?A qu ayudan los patrones?DelegacinEjercicioA qu ayudan los patrones?Causas comunes de rediseoPatrones frente a esos peligrosCmo seleccionar un patrn?Cmo usar un patrn?Patrones de CreacinPatrones de CreacinEjemplo: LaberintoEjemplo: LaberintoAbstract Factory (Factora Abstracta)Abstract FactoryAbstract FactoryAbstract FactoryAbstract FactoryAbstract FactoryEjemplo: LaberintoBuilder (Constructor)BuilderBuilderBuilderBuilderBuilderEjemplo: LaberintoFactory Method (Mtodo Factora)Factory MethodFactory MethodFactory MethodFactory MethodFactory MethodFactora y MetaclasesEjemplo: LaberintoPrototype (Prototipo)PrototypePrototypePrototypePrototypePrototypeEjemplo: LaberintoFactora Abstracta con PrototipoSingletonSingletonSingletonSingletonSingletonPatrones estructuralesAdapter / Wrapper (Adaptador)Adapter / Wrapper (Adaptador)AdapterAdapterAdapterAdapterAdapterAdapterEjercicioBridge / HandleBridge / HandleBridge / HandleBridge / HandleBridgeBridgeBridgeCompositeCompositeCompositeCompositeCompositeCompositeDecorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Facade / FachadaFacade / FachadaFacade / FachadaFacade / FachadaFlyweightFlyweightFlyweightFlyweightFlyweightFlyweightFlyweightFlyweightProxyProxyProxyProxyProxyProxyPatrones de comportamientoChain of Responsibility (Cadena de Responsabilidad)Chain of ResponsibilityChain of ResponsibilityChain of ResponsibilityChain of ResponsibilityChain of ResponsibilityChain of ResponsibilityChain of ResponsibilityRecursion OORecursion OOChain of ResponsibilityCommandCommandCommandCommandCommandCommandCommandCommandCommandInterpreterInterpreterIterator (Iterador)Iterator (Iterador)Iterador ExternoIterador ExternoIteradores Externos en JavaIterador Externo PolimrficoIterador InternoIterador InternoIteratorMediatorMediatorMediatorMediatorMediatorMediatorMediatorMementoMementoMementoMementoObserver / Publish-SubscribeObserverObserverObserverObserverObserverObserverObserverObserver en JavaObserver en JavaObserver en JavaModelo de Eventos de Java 1.1Modelo de Eventos de Java 1.1State (Estado)StateStateStateStateStateStrategy/Policy (Estrategia)StrategyStrategyStrategyStrategyStrategyTemplate Method (Mtodo Plantilla)Template MethodTemplate MethodTemplate MethodTemplate MethodTemplate MethodVisitorVisitorVisitorVisitorVisitorVisitorVisitorDouble-Dispatch
Top Related