Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arquitectura Del Software - Patrones de Diseño
Arquitectura Del Software - Patrones de Diseño
Captulo 3
Patrones de Diseo
Contenidos
Introduccin a los patrones de diseo GoF Patrones de creacin Patrones estructurales Patrones de comportamiento
Patrones de diseo
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 5
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 6
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 7
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.
Patrones de diseo
90 80 70 60 50 40 30 20 10 0 1er trim. 2do trim. 3er trim. 4to trim. Este Oeste Norte
Vistas
Modelo
t1=20 t2=25 t3=90 t4=20
1tr. 20 30 47
2tr. 25 38 47
3tr. 4tr. 90 20 32 32 45 45
Modelo-Vista-Control
Utiliza los siguientes patrones: Observer Composite Strategy Decorator Factory method
Patrones de diseo
10
Plantilla de definicin
Nombre Propsito
Qu hace?, Cul es su razn y propsito?, Qu cuestin de diseo particular o problema aborda?
Sinnimos Motivacin
Escenario que ilustra un problema particular y cmo el patrn lo resuelve.
Patrones de diseo
11
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 12
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?
Clasificacin
Propsito Creacin
mbito Clase
Factory Method
Estructural
Adapter
Comportamiento
Interpreter Template Method Chain of Responsability Command Iterator Mediator Memento Observer State Strategy Visitor
Objeto
Patrones de diseo
14
Patrones de diseo
15
Especificar interfaces
Memento, Decorator, Proxy,..
No declarar variables de clases concretas sino abstractas. Patrones de creacin permiten que un sistema est basado en trminos de interfaces y no en implementaciones.
Patrones de diseo 17
COMPOSICION
- Definicin dinmica - Uso ms complicado - Es posible cambiar en tiempo de ejecucin - No se rompe la encapsulacin - Requiere que se satisfaga cierta interfaz -Se puede sustituir la implem. en tiempo de ejecucin.
Herencia y composicin trabajan juntas Se suele abusar de la herencia. Los diseos suelen ser ms reutilizables si dependen de la composicin.
Patrones de diseo
19
Delegacin
Rectangulo Window area() area() +rectangulo ancho alto
return rectangulo.area
Patrones de diseo
21
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
22
Patrones de diseo
23
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
28
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.
Patrones de diseo
29
Ejemplo: Laberinto
<<abstract>> Sitio entrar()
Muro entrar()
30
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;} }
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
32
Motivacin
Un toolkit interfaz de usuario que soporta diferentes formatos: Windows, Motif, X-Windows,..
Patrones de diseo
33
Motivacin
WidgetFactory createScroolBar() CreateWindow()
Abstract Factory
Cliente
Window
ScrollBar
PMScroolBar
MotifScroolBar
Estructura
AbstractFactory CreateProductA() CreateProductB()
Abstract Factory
Cliente
AbstrProdA
AbstrProdB
ProdB2
ProdB1
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 36
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
37
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.
Patrones de diseo
38
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);} }
Patrones de diseo
39
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; } }
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?
Patrones de diseo
41
Builder
Motivacin
RTFTraductor parseRTF() <<abstract>> ConversorTexto convertirCaracter() convertirCambioFont() ConvertirParrafo()
TextoASCII
TextoTeX
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 } } }
Builder
Estructura
Director Construir() +builder <<abstract>> Builder buildParte()
44
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
45
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 46
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 47
Ejemplo: Laberinto
public class BuilderLaberinto { public void buildLaberinto { }; public void buildPuerta { }; public void buildHabitacion(int n) { }; public Laberinto getLaberinto() { }; protected BuilderLaberinto() { }; }
Patrones de diseo
48
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
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.
Patrones de diseo 50
Factory Method
Motivacin
<<abstract>> Documento open() close() save() revert() <<abstract>> Aplicacion crearDocumento() nuevoDocumento() openDocumento() Documento d d = crearDocumento(); setDoc.add(d); d.open()
mtodo factoria
MiAplicacion MiDocumento crearDocumento()
51
Factory Method
Estructura
<<abstract> Productos <<abstract>> Creador metodoFactoria() unaOperacion() prod = metodofactoria()
ProductoConcreto
CreadorConcreto metodoFactoria()
52
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
53
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
54
Factory Method
<<abstract>> Figura crearManipulador() <<abstract>> Manipulador Cliente downClick() drag() upClick()
Linea crearManipulador()
Circulo crearManipulador()
ManipuladorLinea
ManipuladorCirculo
Patrones de diseo
55
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++)
56
Factora y Metaclases
Cliente Factoria crear(tipo : String) : Producto
P1
P2
57
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);}; }
Patrones de diseo
58
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; } }
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?
Patrones de diseo 60
Prototype
Motivacin
<<abstract>> Tool manipular() <<abstract>> Graphic dibujar() clone()
GraphicTool manipular()
+prototipo
NotaMusical
Prototype
Estructura
Cliente
(from FactoryMethod)
+prototipo
operacion()
PrototipoConcr2 clone()
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
Patrones de diseo
63
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.
64
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.
65
Ejemplo: Laberinto
public 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} }
Patrones de diseo 66
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, new PuertaQueOye, new HabitacionEncantada, new Muro); Laberinto unlab = juego. makeLaberinto(otroLaberinto)
68
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.
Patrones de diseo
69
Singleton
Estructura
Singleton unicaInstancia datoSingleton instancia() operacionSingleton() getSingleton()
return unicaInstancia
Singleton.instancia().operacionSingleton()
70
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.
Patrones de diseo
71
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.
72
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 Smalltalk
new self error: no se puede crear el objeto default -- mtodo de clase UnicaInstancia isNil ifTrue: [UnicaInstancia:= super new]. ^UnicaInstancia.
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 74
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.
Patrones de diseo 75
Motivacin
*
TextView getExtension()
76
Estructura Adapter/Clase
Cliente Objetivo metodo1() Adaptado especificoMet1()
77
Estructura Adapter/Objeto
Cliente Objetivo metodo1() Adaptado especificoMet1()
adaptado. especificoMet1()
78
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.
Patrones de diseo
79
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.
80
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?
81
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
82
Adapter
Objetivo, Cliente
TreeDisplay getChildren(Node) CreateGraphicNode(Node) display() BuilTree(Node n)
adaptado adaptador
Adapter
Cliente
TreeDisplay +delegate setDelegate(delegate) display() buildTree(Node n) TreeAccesorDelegate getChildren(TreeDisplay, Node) CreateGraphicNode(TreeDisplay, Node)
Objetivo
adaptador
adaptado
FileSystemEntity
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
85
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 86
Bridge / Handle
Motivacin
Implementacin de una abstraccin window portable en una librera GUI.
Window Window
X Window
PMWindow
X Window
PMWindow
IconWindow
PMIconWindow X IconWindow
Patrones de diseo
Bridge / Handle
Motivacin
Window mostrarTexto() mostrarRect() +imp
IconWindow mostrarBorde()
TransientWindow mostrarCaja()
mostrarRect() mostrarTexto()
mostrarRect() mostrarTexto()
XmostrarLinea()
XmostrarTexto()
Bridge / Handle
Abstraccion operacion() +imp imp.operacionImp Implementacion operacionImp()
AbstraccionRefinada
ImplemA operacionImp()
ImplemB operacionImp()
Estructura
89
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 90
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
Patrones de diseo
91
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.
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,..)
Patrones de diseo
93
Composite
Motivacin
<<abstract>> Figura dibujar() add(Figura) remove(Figura) getHijo(int)
Linea dibujar()
Rectangulo dibujar()
94
Composite
Estructura
<<abstract>> Componente Cliente operacion() add(Componente) remove(Componente) getHijo(int)
Hoja operacion()
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
96
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.
Patrones de diseo 97
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?
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.
Patrones de diseo
99
Decorator (Decorador)
VisualComponente mostrar()
Motivacin
TextView mostrar()
Decorator (Decorador)
unB orderD ecorator
Motivacin
unTextV iew
Decorator (Decorador)
Componente operacion()
Estructura
CompConcreto operacion()
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.
Patrones de diseo
103
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.
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.
105
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.
106
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 Compiler acta como fachada.
Patrones de diseo 107
Estructura Fachada
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
109
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.
Patrones de diseo
110
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 space en C++).
111
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
112
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.
Patrones de diseo 113
Flyweight
Flyweight carcter de un texto:
estado intrnseco: cdigo del carcter estado extrnseco: informacin sobre posicin y estilo
Elemento mostrar(contexto) intersec(point, contexto)
Caracter
Flyweight
FlyweightFactory getFlyweight() <<abstract>> Flyweight operacion(estadoExt)
Estructura
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
116
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 117
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
Patrones de diseo
118
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
119
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.
Patrones de diseo 120
Proxy
<<abstract>> Grafico EditorDocumentos dibujar() getExtension() store() load() if (image == null) {im age = loadIm age(nom breFich)} else {imagen. dibujar()} Imagen impImagen extension dibujar() getExtension() store() load() ProxyImagen nombreFich extension dibujar() getExtension() store() load() if (im agen == null) { return extension} else {imagen.getExtension}
Motivacin
+imagen
Proxy
Cliente
(from flyweight)
Estructura
Proxy operacion()
sujeto.operacion()
122
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
123
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
124
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 Proxy para todos los tipos de sujetos.
Patrones de diseo
125
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
126
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.
Patrones de diseo 127
Chain of Responsibility
+manejador ManejadorAyuda manejarAyuda()
Motivacin
manejador.manejarAyuda
Aplicacion1
Widget
Dialog
Chain of Responsibility
GuardarDialogo : Dialog printBoton : But ton printDialogo : Dialog OKBoton : But ton : Aplicacion
Patrones de diseo
129
Chain of Responsibility
Estructura
Cliente
(from FactoryMethod)
Manejador manejarSolicitud()
+sucesor
ManejadorConcr1 manejarSolicitud()
ManejadorConcr2 manejarSolicitud()
130
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
131
Chain of Responsibility
Consecuencias
Reduce acoplamiento Proporciona flexibilidad al asignar responsabilidades No se garantiza el manejo de la solicitud
Patrones de diseo
132
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
133
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 134
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
135
Recursion OO
Persona >> = unaPersona ^self nombre = unaPersona nombre NombrePersona >> = unaPersona ^ (self nombre = unaPersona nombre) and: [self apellidos = unaPersona apellidos] String >> = aString ...
Patrones de diseo
136
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.
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.
Patrones de diseo 138
Command
Aplicacion2 add(Document) Menu add(MenuItem) MenuItem +command clicked() Command ejecutar()
document.paste
Motivacin
139
Command
Cliente1 Invocador Command ejecutar()
Receptor accion()
receptor.accion()
Estructura
140
Command
r : Receptor : Client e co : Command 1. Command (r) : Invocador
2. regist rarCommand(co)
Colaboracin
141
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 142
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
143
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
144
Command
Implementacin
Un objeto Command es realmente un Adapter: Command plugabble. Podemos evitar la jerarqua de subclases de Command si no necesitamos la facilidad undo/redo. En Smalltalk,
self receptor perform: unSelector with: unArg
Patrones de diseo
145
Command
Ejemplo 1: Comparar dos objetos utilizando cualquier
criterio de ordenacin: interface Comparator en Java public 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.
Patrones de diseo
146
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 147
Interpreter
Estructura
Contexto
Cliente3
ExpresionAbstracta interpretar(Contexto)
ExpresionTerminal interpretar(Contexto)
ExpresionNoTerminal interpretar(Contexto)
Patrones de diseo
148
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 149
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
150
Iterador Externo
ListIterator Lista +list count() append() remove() first() next() hasNext() item() index()
Patrones de diseo
151
Iterador Externo
List list = new List(); ... ListIterator iterator = new ListIterator(list); iterator.first(); while (!iterator.isDone()) { Object item = iterator.currentItem(); // cdigo para procesar item iterator.next(); } ...
Patrones de diseo 152
Lista
ListIterator
Patrones de diseo
154
Iterador Interno
<<abstract>> ListaAbstracta count() append() remove() <<abstract>> Iterator doAll() doIf() action() test()
Cliente
Iterador Interno
public void doIf() { iterator.first(); while (!iterator.isDone()) { Object item = iterator.currentItem(); if (test(item)) action(item) iterator.next(); } }
Patrones de diseo
156
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
157
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.
Patrones de diseo 158
Mediator
Motivacin
DialogDirector showDialog() createWidgets() widgetChanged(Widget) Widget +director (from Logical View) changed() director.WidgetChanged(this)
+list
ListBox getSelection()
EntryField setText()
+field
159
Mediator
Motivacin
:Cliente :FontDialogDirector showDialog widgetChanged :ListBox :EntryField
getSelection
setText
160
Mediator
<<abstract>> Mediator +mediator Colega
MediatorConcreto
ColegaConcr1
ColegaConcr2
Estructura
161
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
162
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
163
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
164
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
Patrones de diseo
165
Memento
Creator estado setMemento(Memento) CrearMemento() Memento estado getEstado() setEstado()
+memento
Guardian
estado = m. getEstado
Estructura
166
Memento
: Guardian : Creador m : Memento
2. setMemento(m)
2.1. getEstado()
Colaboracin
167
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
168
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
169
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 Command para el mecanismo undo/redo.
Patrones de diseo
170
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
Patrones de diseo
171
Motivacin
90 80 70 60 50 40 30 20 10 0 1er trim. 2do trim. 3er trim. 4to trim. Este Oeste Norte
Vistas
Modelo
t1=20 t2=25 t3=90 t4=20
1tr. 20 30 47
2tr. 25 38 47
3tr. 90 32 45
4tr. 20 32 45
Observer
Estructura
Subject subjectState Attach() Detach() Notify() +observers 1..1 1..* Observer Update()
173
Observer
Colaboracin
: Otra 1. setEstado() 1.1. notify() 1.1.1. update() 1.1. 2. updat e() : Subject o1 : Observer o2 : Observer
174
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
175
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
176
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 177
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 Subject consistente 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 178
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 179
Observer en Java
public 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 180
Observer en Java
Patrones de diseo
181
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: implementa addObserver y deleteObserver e invoca a notifyObservers() Se delega el comportamiento que necesita ConcreteSubject al objeto Observable que contiene. Por qu una subclase de Observable?
Patrones de diseo 182
Patrones de diseo
183
Patrones de diseo
184
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.
Patrones de diseo
185
State
TCPConexion +state open() close() acknowledge() open() close() acknowledge() TCPState
state.acknowledge()
Motivacin
186
State
Context solicitud() +state State operacion()
StateConcr2 operacion()
Estructura
187
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
188
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
189
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
190
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?
Patrones de diseo
191
Strategy
Composicion recorrer() formato() +algoJustif Justificacion justificar()
JustificacionTeX justificar()
Motivacin
192
Strategy
Contexto InterfaceContexto() +estrategia Estrategia algoritmoInterface()
EstrategiaA algoritmoInterface()
EstrategiaB algoritmoInterface()
Estructura
193
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
194
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
195
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
196
Motivacin
Fundamental para escribir cdigo en un framework. Clase Aplicacin que maneja objetos de la clase Documento: mtodo OpenDocument
Patrones de diseo
197
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 198
Template Method
has(v:G): Boolean is do from start until after or else equal(v,item) loop forth end Result := not after end
Patrones de diseo
199
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
200
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 201
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
202
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,...
Patrones de diseo 203
Visitor
Motivacin
Nodo comprobarTipo() generarCodigo() prettyPrint()
204
Visitor
Motivacin
Nodo aceptar(VisitorNodo v) Programa
NodoVariableRef aceptar(VisitorNodo v)
NodoAsignacion Aceptar(VisitorNodo v)
v.visitarVariableRef(this)
v.visitarAsignacion(this)
205
Visitor
Motivacin
VisitorNodo visitarAsignacion(NodoAsignacion) visitarVariableRef(NodoVariableRef)
206
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 207
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 208
Visitor
Implementacin
El patrn permite aadir operaciones a clases sin cambiarlas. Esto se consigue aplicando la tcnica doubledispatch. Quin es responsable del recorrido de la estructura de objetos? Estructura de objetos Un iterador El visitor
Patrones de diseo
209
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
210