Documentos de Académico
Documentos de Profesional
Documentos de Cultura
TUTORIAL Patronesdiseño
TUTORIAL Patronesdiseño
Ernesto Pimentel
Patrones de Diseo
Contenido
La nocin de patrn de diseo. Ventajas e inconvenientes. Una clasificacin de patrones de diseo. Presentacin de patrones de diseo. Ejemplos de aplicacin de patrones.
Patrones de Diseo
Patrones de Diseo
Ernesto Pimentel
Patrones de Diseo
Los L.O.O. facilitan la reutilizacin de cdigo, pero un buen diseo es la clave para una reutilizacin efectiva. Un diseador experimentado producir diseos ms simples, robustos y generales; fcilmente adaptables a cambios. Los patrones de diseo pretenden explotar soluciones efectivas a determinados problemas.
Patrones de Diseo
Patrones de Diseo
Un patrn es una solucin probada que se puede aplicar con xito a un determinado tipo de problemas que aparecen repetidamente en el desarrollo de sistemas software. No son bibliotecas de clases, sino un esqueleto bsico que cada desarrollador adapta a las peculiaridades de su aplicacin. Los patrones se describen en forma textual, acompaados de diagramas (habitualmente de clases e interaccin) y pseudocdigo. Se deben distinguir de los estilos arquitectnicos y, en particular, de los marcos de trabajo.
Patrones de Diseo
Patrones de Diseo
Ernesto Pimentel
Patrn de diseo
Patrones de Diseo
Incremento de la reutilizacin
5 6
Patrones de Diseo
Ernesto Pimentel
Patrones de Diseo
Inconvenientes
El uso de un patrn no se refleja claramente en el cdigo:
A partir de la implementacin es difcil determinar qu patrn de diseo se ha utilizado. No es posible hacer ingeniera inversa. Muchos patrones utilizan la delegacin de operaciones y esto provoca el conocido problema del mbito local de los objetos (self). Las clases del patrn son roles genricos, pero en la implementacin aparecen clases concretas.
Referencias a self:
Patrones de Diseo
Patrones de Diseo
Ernesto Pimentel
El modelo es el objeto que se desea evaluar. La vista (o vistas) dan la informacin visual del objeto y permiten el acceso al mismo mediante una interfaz de usuario. El controlador se encarga de atender las peticiones que el usuario realiza sobre la vista, invocando las acciones necesarias sobre el modelo.
Patrones de Diseo
El patrn Observer: para desacoplar las vistas del modelo; un cambio en el modelo repercute en las vistas (si hay varias) sin que stas sean accesibles desde aqul. El patrn Composite: las vistas habitualmente pueden estar anidadas, de forma que el tratamiento de los objetos complejos (paneles) coincide con el de cada componente (botones, mens, etc.) El patrn Strategy: El objeto controlador encapsula la forma en que el modelo responde a acciones sobre la vista; cambiando el controlador, la forma de responder puede cambiar.
Patrones de Diseo
10
Patrones de Diseo
Ernesto Pimentel
Segn su mbito:
Patrones de creacin. Se refieren a la creacin de instancias. Patrones estructurales. Se refieren a las relaciones entre clases y/u objetos. Patrones de comportamiento. Caracterizan la forma en que las clases u objetos interactan y distribuyen sus responsabilidades (servicios). Patrones de clases. Tratan con relaciones de herencia (esttica) entre clases. Patrones de objetos. Se refieren a relaciones de composicin entre objetos, que pueden cambiar en tiempo de ejecucin y son ms dinmicas.
Patrones de Diseo
11
ESTRUCTURAL
COMPORTAMIENTO
Fbrica de mtodos Adaptador (clases) Fbrica abstracta Constructor Prototipo Singular Adaptador (objetos) Puente Compuesto Decorador Fachada Peso ligero Representante (proxy)
Intrprete Plantilla de mtodos Cadena de mando Instruccin Iterador Mediador Memoria Observador Estado Estrategia Visitante
Patrones de Diseo
12
MBITO
OBJETO
Patrones de Diseo
Ernesto Pimentel
El patrn Adaptador
Adapta la interfaz de una clase a la interfaz esperada por sus clientes. Favorece la reutilizacin (de la clase adaptada) y permite la colaboracin con interfaces incompatibles. Tambin se conoce como Wrapper. Es un patrn estructural con una versin y otra para objetos. para clases
Se puede aplicar cuando se desea reutilizar una clase existente, pero su interfaz no concuerda con lo que se necesita.
Patrones de Diseo
13
Adaptador: motivacin
Se est desarrollando un editor de dibujos que permite realizar diagramas a partir de elementos grficos como lneas, crculos, texto, etc. Un elemento fundamental de dicho sistema es la clase ObjetoGrfico, que proporciona operaciones para modificar su forma (editar()) y para representarlo (dibujar()). Esta clase se especializa para cada tipo de objeto grfico: Lnea, Crculo, etc., clases donde se han implementado adecuadamente dichas operaciones. Sin embargo, la edicin y representacin de textos es una tarea complicada, por lo que se desea reutilizar la clase Text de la biblioteca de clases del entorno de programacin. No obstante, la interfaz de Text (con operaciones como edit() y draw()) no se corresponde con la declarada por ObjetoGrfico. Por este motivo, se necesita desarrollar una clase Texto (adaptador) que adapte la clase Text (adaptada) a la interfaz declarada por ObjetoGrfico (objetivo).
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
14
Patrones de Diseo
Ernesto Pimentel
Adaptador: motivacin
ObjetoGrfico EditorGrfico dibujar( ) editar( ) draw( ) edit( ) Text
Patrones de Diseo
15
Text
Patrones de Diseo
16
Patrones de Diseo
Ernesto Pimentel
Patrones de Diseo
17
El patrn Adaptador
Es un patrn de diseo estructural con dos versiones:
Cliente Objetivo Adaptado
+ mtodo()
+mtodoEspecifico() adapt
Adaptador
18
Patrones de Diseo
Ernesto Pimentel
El patrn Singular
Es un patrn de creacin para objetos. Asegura que una clase tiene una nica instancia
se puede generalizar a un nmero fijo de instancias.
Patrones de Diseo
20
10
Patrones de Diseo
Ernesto Pimentel
Singular: motivacin
En ocasiones es necesario utilizar clases
que posean una nica instancia que sea accesible desde el resto del sistema.
Patrones de Diseo
21
Singular: solucin
Para asegurar que se crea una sola instancia
el constructor de la clase no debe ser pblico.
El almacenamiento de la instancia
se har en una variable de clase (esttica).
La creacin de la instancia
se har la primera vez que se invoque este mtodo.
Patrones de Diseo
22
11
Patrones de Diseo
Ernesto Pimentel
El patrn Singular
Instancia (...) { if (instancianica == null) instancianica = new Singular(...); return instancianica; }
Patrones de Diseo
23
Patrones de Diseo
24
12
Patrones de Diseo
Ernesto Pimentel
Patrones de Diseo
25
Patrones de Diseo
26
13
Patrones de Diseo
Ernesto Pimentel
Una aplicacin que use estas caractersticas no debera codificar explcitamente la creacin de objetos especficos del look-and-feel concreto, pues ello complicara la modificacin posterior del mismo. Tampoco es razonable contemplar las distintas posibilidades de lookand-feel mediante sentencias condicionales que se repiten cada vez que se crea un panel o ventana; sera difcil extender la aplicacin a nuevos look-and-feel.
Patrones de Diseo
27
14
Patrones de Diseo
Ernesto Pimentel
Aprovechamos la jerarqua de clases entre componentes Polimorfismo sobre los datos Vinculacin dinmica Patrones de Diseo 29
La clase FbricaComponente se desglosa en distintas factoras, una para cada tipo de look-and-feel:
FbricaMotif FbricaPM FbricaOW
Patrones de Diseo
30
15
Patrones de Diseo
Ernesto Pimentel
Cliente
Ventana
VentanaOW FbricaOW
crearVentana():Ventana crearBotn():Botn FbricaMotif crearScroll():BarraScrolll crearVentana():Ventana crearBotn():Botn crearScroll():BarraScrolll crearVentana():Ventana
VentanaPM
VentanaMotif
Botn
FbricaPM
BotnOW
BotnPM
BotnMotif
crearBotn():Botn crearScroll():BarraScrolll
IDEAS 2007. Isla Margarita, Venezuela
Patrones de Diseo
31
La responsabilidad de la creacin de objetos recae en la fbrica Desacoplamiento total entre cliente y componentes Fcil reutilizacin y extensin a nuevos requisitos
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
32
16
Patrones de Diseo
Ernesto Pimentel
Cliente
ProdAbstA
ProductoA1 FbricaConcreta1
crearVentana():Ventana crearBotn():Botn FbricaConcreta3 crearScroll():BarraScrolll crearVentana():Ventana crearBotn():Botn crearScroll():BarraScrolll crearVentana():Ventana
ProductoA2
ProductoA3
ProdAbstB
FbricaConcreta2
ProductoB1
ProductoB2
ProductoB3
crearBotn():Botn crearScroll():BarraScrolll
IDEAS 2007. Isla Margarita, Venezuela
Patrones de Diseo
33
Las clases fbricas concretas son implementadas habitualmente con factoras de mtodos (patrn Mtodos Factora), pero tambin con el patrn Prototipo.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
34
17
Patrones de Diseo
Ernesto Pimentel
El patrn Estado
Es un patrn de comportamiento para objetos. Se debe usar si:
El comportamiento de un objeto depende de su estado, y se ve modificado en tiempo de ejecucin. Las operaciones se definen mediante grandes instrucciones condicionales que dependen del estado del objeto (usualmente representado por una o ms constantes enumeradas).
Patrones de Diseo
36
18
Patrones de Diseo
Ernesto Pimentel
19
Patrones de Diseo
Ernesto Pimentel
Estado: motivacin (y V)
Problemas de reutilizacin:
Los mtodos deben ser codificados de nuevo, sin posibilidad de reutilizar las versiones de la superclase. Obsrvese que incluso el mtodo reset(), cuyo comportamiento no vara, debe ser redefinido en su totalidad.
No se trata de un problema de implementacin, sino de diseo. El problema se produce al codificar el estado con un valor, Lo que da lugar a un anlisis esttico de casos. La solucin consiste en codificar el estado con una clase.: Lo que permite explotar el polimorfismo de datos, Haciendo corresponder cada rama de comportamiento condicional con una subclase.
Patrones de Diseo
40
20
Patrones de Diseo
Ernesto Pimentel
Vaco
Lleno
+get():void +put():void
Lleno2
Uno
Patrones de Diseo
41
El patrn Estado
Contexto 1 +mtodo(args) +cambiarEstado(Estado) contexto estado 1 +mtodo(,Contexto) Estado
EstadoN
+mtodo(,Contexto) +mtodo(,Contexto)
void cambiarEstado(Estado est) { estado = est; } void mtodo(, Contexto ctx) { ctx.cambiarEstado(new EstadoM()); }
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
42
21
Patrones de Diseo
Ernesto Pimentel
Los cambios de estado implican la continua creacin de instancias de las subclases de Estado.
si dichas subclases no tienen atributos, se puede aplicar el patrn Singular. para aumentar la reutilizacin se puede utilizar el patrn Fbrica Abstracta.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
43
El patrn Estrategia
Patrn de comportamiento a nivel de objetos Define una familia de algoritmos, los encapsula en clases distintas, y los hace intercambiables. El patrn Estrategia permite variar los algoritmos hacindolos indendientes de los clientes que los utilizan.
Patrones de Diseo
44
22
Patrones de Diseo
Ernesto Pimentel
Estrategia: motivacin
Existe una gran variedad de algoritmos para dividir un prrafo en lneas. Incluir todos estos algoritmos dentro de las clases que los pueden requerir no es deseable por varios motivos:
Estos problemas se pueden evitar definiendo clases que encapsulen cada uno de los algoritmos (que podemos denominar estrategia).
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
Los clientes que necesiten estos algoritmos se hacen ms complejos si incluyen el cdigo de los mismos. Esto los hace ms grandes y difciles de mantener, especialmente si soportan varios algoritmos de guionacin. Diferentes algoritmos pueden ser apropiados en momentos distintos. No es necesario albergar varios algoritmos de guionacin si no se usan nunca. Es difcil aadir nuevos algoritmos o modificar alguno existente cuando el mtodo de guionacin es parte integral del cliente.
45
Estrategia: solucin
Formato Prrafo formato
guionacin()
formatear()
FormatoTxt
FormatoTeX
FormatoWord
guionacin()
guionacin()
guionacin()
formato.guionacin()
Patrones de Diseo
46
23
Patrones de Diseo
Ernesto Pimentel
El patrn Estrategia
Estrategia Contexto estrategia
algoritmo()
aplicarAlgoritmo()
EstrategiaA
EstrategiaB
EstrategiaC
algoritmo()
algoritmo()
algoritmo()
estrategia.algoritmo()
Patrones de Diseo
47
24
Patrones de Diseo
Ernesto Pimentel
El patrn Observador
Patrn de comportamiento para objetos. Permite definir dependencias entre objetos de forma que si un objeto cambia de estado todos los dependientes de l son notificados y actualizados automticamente. Proporciona mecanismos para registrar objetos observadores en el objeto observable y notificar a aquellos cuando ste sufre alguna modificacin. Se utiliza cuando se divide un sistema en clases que cooperan y se desea mantener la consistencia entre objetos relacionados, pero sin que estn altamente acoplados, pues ello comprometera su reutilizacin.
Patrones de Diseo
49
Observador: motivacin
Consideremos una interfaz grfica de usuario en la que se poseen diversas representaciones de determinados datos de una aplicacin. Las clases que determinan los datos (el modelo) y las distintas representaciones grficas (las vistas) pueden ser reutilizadas independientemente. Por ejemplo, una hoja de clculo, un diagrama de barras y un diagrama de sectores pueden mostrar diferentes presentaciones de los datos de una aplicacin, pero cada uno de esos tres objetos pueden ser utilizadas independientemente en otras aplicaciones. Las modificaciones sobre los datos deben repercutir en las tres presentaciones, e incluso podra ocurrir que alguno de los diagramas fuese editable, y modificaciones en l tambin repercutiran en el resto de diagramas y en los propios datos.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
50
25
Patrones de Diseo
Ernesto Pimentel
Observador: motivacin
60 50 40 30 20 10 0 x a b c
x
b a c
a b c
50 30 20
no tif ca r su sc rib ir
ir rib sc su r ca tif
}
no
IDEAS 2007. Isla Margarita, Venezuela
Patrones de Diseo
51
Observador: solucin
Observable
obs
Observador
actualizar()
DiagramaBarras
Datos
return estadoDatos
IDEAS 2007. Isla Margarita, Venezuela
26
Patrones de Diseo
Ernesto Pimentel
El patrn Observador
Observable
obs 0..n
for each o in obs { o.actualizar(); }
Observador
actualizar()
ObservableConcreto
return estadoObservable
IDEAS 2007. Isla Margarita, Venezuela
otroObservadorConcreto
notificar()
Patrones de Diseo
54
27
Patrones de Diseo
Ernesto Pimentel
Patrones de Diseo
55
28
Patrones de Diseo
Ernesto Pimentel
Es conveniente evitar notificaciones especficas para observadores concretos, y llegar a un compromiso entre:
En estos casos, suele ser conveniente complementar el patrn con un gestor de cambios cuya responsabilidad incluye:
Mantenimiento de la asociacin de cada observable con sus observadores, liberando de ello a todos ellos. Definicin de una poltica de actualizacin. Actualizacin de todos los observadores necesarios a peticin de un objeto observable. El gestor puede especializarse con diferentes polticas, construyendo una jerarqua.
Patrones de Diseo
58
29
Patrones de Diseo
Ernesto Pimentel
observables
Observador
actualizar(Observable)
gestor 0..n
GestorCambios
Map<Observable,Observer>
observadores
suscribir(Observable,Observer) darBaja(Observable,Observer) notificar() for each o in observables for each p in s.observers p.actualizar(o) for each o in observables for each p in s.observers p.actualizar(o)
Patrones de Diseo
59
El patrn Prototipo
Patrn para la creacin de objetos. Especifica el tipo de objetos que se deben crear utilizando un prototipo de instancia, y creando nuevos objetos por medio de la copia de este prototipo.
Patrones de Diseo
60
30
Patrones de Diseo
Ernesto Pimentel
Prototipo: motivacin
Consideremos la construccin de un editor de pentagramas, que pretende reutilizar un marco de trabajo que define editores grficos mediante la incorporacin de nuevos objetos que representan notas y otros elementos musicales. El marco de trabajo para este editor grfico dispondr de una paleta de herramientas para aadir estos objetos musicales al pentagrama. La paleta tambin incluir herramientas para seleccionar, mover y manipular estos objetos, y el usuario podr seleccionar una u otra a su eleccin.
Patrones de Diseo
61
Prototipo: motivacin
Supongamos que el marco proporciona:
Una clase abstracta Graphic para las componentes grficas. Una clase abstracta Tool para definir herramientas como las mencionadas para constituir la paleta. Una subclase GraphicTool para herramientas que crean instancias de objetos grficos y las aaden al documento.
Patrones de Diseo
62
31
Patrones de Diseo
Ernesto Pimentel
Prototipo: motivacin
La clase GraphicTool presenta un problema de diseo:
Las clases para notas y dems elementos musicales son especficas de nuestra aplicacin. Pero la clase GraphicTool pertenece al marco genrico, y desconoce cmo crear instancias de las clases musicales para ser aadidas al pentagrama.
Una solucin sera subclasificar GraphicTool tantas veces como tipos de objetos musicales tengamos, pero esto producira una explosin de clases que slo diferiran en el tipo de objeto musical a instanciar. Una alternativa es utilizar delegacin en vez de herencia, pero cmo podemos utilizar el marco de trabajo utilizar delegacin para parametrizar la clase GraphicTool con el tipo de Graphic que se supone que debe crear? La solucin pasa por hacer que GraphicTool cree los objetos grficos copiando o clonando una instancia dada de la subclase adecuada de Graphic:
Para ello, es necesario que todas las sublcases de Graphic soporten la operacin clone(), o similar.
Patrones de Diseo
63
Prototipo: aplicacin
Tool Graphic
manipular()
prototipo dibujar(Posicin)
clone()
RotateTool manipular()
Patrones de Diseo
64
32
Patrones de Diseo
Ernesto Pimentel
El patrn Prototipo
Cliente
prototipo Prototipo
clone()
operacin()
PrototipoConcreto2 clone()
Patrones de Diseo
65
El patrn Prototipo: algunas consideraciones Se debe utilizar cuando un sistema debe ser independiente de cmo se crean, componen y representan sus productos:
Cuando las clases a instanciar se especifican en tiempo de ejecucin (p.ej. carga dinmica) Para evitar construir jerarquas de clases paralelas Cuando las instancias de una clase pueden contener una de un nmero limitado de combinaciones de estados.
Patrones de Diseo
66
33
Patrones de Diseo
Ernesto Pimentel
Patrones de Diseo
67
34
Patrones de Diseo
Ernesto Pimentel
fil.filtrado(Datos)
Decodificador
LectorCodificado
LectorFiltro
Filtro
decode(Datos)
tratamiento(Datos)
tratamiento(Datos)
fil
filtrado(Datos)
Patrones de Diseo
69
mtodoPlantilla()
operacinPrimitiva1() operacinPrimitiva2()
operacinPrimitiva1() operacinPrimitiva2()
ClaseConcreta
operacinPrimitiva1() operacinPrimitiva2()
Patrones de Diseo
70
35
Patrones de Diseo
Ernesto Pimentel
Patrones de Diseo
71
Patrones de Diseo
72
36
Patrones de Diseo
Ernesto Pimentel
La informacin de ayuda se organiza atendiendo a su profundidad en el contexto: de los elementos ms internos a los ms externos. El problema radica en que el objeto que finalmente proporciona la ayuda no es conocido explcitamente por el objeto solicitante.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
73
unaAplicacin ayuda
37
Patrones de Diseo
Ernesto Pimentel
pedirAyuda()
ayuda.pedirAyuda();
Aplicacin
Componente
Dilogo
Botn
pedirAyuda() mostrarAyuda()
IDEAS 2007. Isla Margarita, Venezuela
peticin()
superior.peticin();
GestorConcreto1
GestorConcreto2
peticin()
peticin()
if (this atiende peticin) { } else { super.peticin(); }
acciones
Patrones de Diseo
76
38
Patrones de Diseo
Ernesto Pimentel
El patrn Mediador
Patrn de comportamiento para objetos que define un objeto que encapsula cmo un conjunto de objetos interacta entre s. El diseo orientado a objetos promueve la distribucin del comportamiento entre objetos, pero esa distribucin puede implicar estructuras con muchas conexiones entre los objetos: en el peor de los casos, cada objeto tiene conocimiento de todos los dems. Dividir un sistema en muchos objetos aumenta la reutilizacin, pero la proliferacin de interconexiones tiene de disminuirla: los objetos son difcilmente reutilizables sin la presencia de los otros con los que se comunica.
Patrones de Diseo
78
39
Patrones de Diseo
Ernesto Pimentel
Mediador: motivacin
Consideremos la implementacin de cajas de dilogo en una interfaz grfica de usuario: un dilogo utiliza una ventana para presentar una coleccin de componentes como botones, mens y campos de texto. A menudo se producen dependencias entre los distintos componentes del dilogo: por ejemplo, un botn puede estar desactivado mientras un campo de texto est vaco, la seleccin de un elemento en una lista desplegable puede cambiar el contenido de un campo de texto, etc. Diferentes dilogos pueden presentar dependencias entre componentes distintas; as, aunque los dilogos incluyen los mismos tipos de componentes, no pueden simplemente reutilizar clases de componentes existentes, sino que tienen que ser personalizadas para reflejar las depencias especficas del dilogo. Una personalizacin individualizada mediante subclasificacin es excesivamente tedioso, ya que muchas clases estaran implicadas. Una solucin es definir un objeto mediador independiente, responsible de controlar y coordinar las interaccciones de un grupo de objetos. stos slo conocen al mediador y no necesitan tener constancia unos de otros.
Patrones de Diseo
79
Mediador: solucin
mediador
DirectorDilogo Componente
cambio()
mediador.compCambio(this);
MostrarDilogo()
crearComponentes() compCambio(Componente)
MenDesplegable CampoTexto
getSeleccin()
DirectorDilogoFuente
setTexto() campo
men
crearComponentes() compCambio(Componente)
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
80
40
Patrones de Diseo
Ernesto Pimentel
El patrn Mediador
mediador
Mediador Componente
CompConcreto1 MediadorConcreto
CompConcreto2
Patrones de Diseo
81
Mediador: consideraciones
Un mediador rene el comportamiento que, de otro modo, estara distribuido entre varios objetos. Extender dicho comportamiento slo requiere heredar de la clase Mediador. Un mediador permite el desacoplamiento entre componentes, reemplazando interacciones muchos-amuchos por uno-a-muchos. No es necesario definir una clase abstracta Mediador cuando las componentes se organizan con un solo mediador. Las componentes han de comunicarse con su mediador cuando ocurre algo de inters. Esto se puede implementar con ayuda del patrn Observador.
Patrones de Diseo
82
41
Patrones de Diseo
Ernesto Pimentel
El patrn Decorador
Este patrn de diseo permite aadir responsabilidades adicionales a un objeto de forma dinmica. Los decoradores proporcionan una alternativa flexible a la subclasificacin para aadir funcionalidad.
Patrones de Diseo
83
Decorador: solucin
Componente operacin() { componente.operacin(); }
+operacin():
componente
ComponenteConcreta
Decorador
+operacin():
+operacin ():
DecoradorConcreto1
DecoradorConcreto2
DecoradorConcretoN
42
Patrones de Diseo
Ernesto Pimentel
Patrones de Diseo
85
+write() FileOutputStream
+write() FileOutputStream
FilterOutputStream
+write() +write()
DataOutputStream
BufferedOutputStream
PrintStream
+write()
+write()
+write()
Patrones de Diseo
86
43
Patrones de Diseo
Ernesto Pimentel
El patrn Compuesto
Compone objetos en tres estructuras para representar jerarquas que relacionan el todo con las partes. Este patrn deja a los clientes tratar objetos individuales y su composicin de forma uniforme.
Patrones de Diseo
87
Compuesto: motivacin
Las herramientas de desarrollo de interfaces grficas de usuario (GUI) proporcionan mecanismos para la creacin y gestin de ventanas con diversos componentes:
grficos, reas de texto, botones, etiquetas, ventanas con barras de desplazamiento, etc. el usuario de la herramienta puede crear ventanas con cualquier combinacin de estos elementos.
En Java se utiliza la clase Component del paquete java.awt, y una clase Container que puede estar compuesta de un nmero indeterminado de componentes, que pueden ser:
simples (como JButton, JLabel, JTextField, etec.), o componentes complejos (como los proporcionados por el paquete javax.swing por ejemplo, JScrollPane, JTabbedPane o JSplitPane).
Patrones de Diseo
88
44
Patrones de Diseo
Ernesto Pimentel
Container
JComponent
JScrollPane
1 JSplitPane
JComboBox
JLabel
paint()
JTabbedPane
Patrones de Diseo
89
Compuesto: solucin
Componente
*
+operacin(): comp
ComponenteConcreta1
Compuesto
+operacin(): ComponenteConcreta2
+operacin ():
+operacin(): ComponenteConcretaN
+operacin():
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
90
45
Patrones de Diseo
Ernesto Pimentel
El patrn Iterador
Proporciona una forma de acceder secuencialmente a los elementos de una coleccin sin mostrar la representacin interna de la misma. Permite definir diversos recorridos sobre una estructura, admitiendo el uso simultneo de la misma por parte de varios clientes.
Patrones de Diseo
91
Iterador: solucin
Cada cliente tendr acceso a la coleccin mediante una instancia de la clase Iterador.
Dicha instancia ser proporcionada por la coleccin a la que se quiere acceder.
La clase que implemente el iterador deber tener acceso a la implementacin de la coleccin sobre la que itera. Se podrn proporcionar tantos iteradores como se desee, implementando diversos recorridos:
del principio al final (o al revs), segn el orden de los elementos almacenados, de forma aleatoria, etc.
Patrones de Diseo
92
46
Patrones de Diseo
Ernesto Pimentel
Collection
Iterator
List
ListIterator
<< implementation>>
+previous():Object
BeanContextSupport
BCSIterator
Patrones de Diseo
93
El patrn Representante
Se trata de un patrn estructural de objetos que proporciona un representante (proxy) para controlar el acceso a un objeto. Ejemplo: diferir la creacin de objetos pesados hasta el momento que se necesite accederlos.
Considrese un editor de textos que permita incrustar imgenes en los documentos. La carga de imgenes grandes es una operacin lenta, que no necesita realizarse al abrir el documento, sino slo cuando una imagen se encuentra en el rea de visualizacin. No obstante, ser necesario tener en cuenta el tamao de las imgenes para poder maquetar el documento.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
Relacin con?
94
47
Patrones de Diseo
Ernesto Pimentel
Inconvenientes:
Un puntero no es un objeto, no puede recibir mensajes. No permite almacenar datos necesarios como el tamao
de la imagen. Se complica el editor, que debe conocer el uso del objeto y distinguir si est cargado o no.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
95
Representante: solucin
Utilizamos un objeto como representante de la imagen. El representante har las funciones de la imagen mientras esta no est cargada.
:Documento imagen :Representante fichero imagen :Imagen datos
48
Patrones de Diseo
Ernesto Pimentel
Representante: funcionamiento
Utilizamos un objeto como representante.
:Documento imagen :Representante tamao fichero getTamao() { if (imagen == null) return tamao else return imagen.getTamao(); } getTamao() dibujar() imagen :Imagen tamao Load(File) getTamao() dibujar()
Proxy de proteccin
Referencia inteligente
Patrones de Diseo
98
49
Patrones de Diseo
Ernesto Pimentel
Representante: estructura
El proxy debe apuntar al objeto representado.
Representante imagen Imagen tamao Load(File) getTamao() dibujar()
Patrones de Diseo
99
Representante: estructura
Las interfaces de representante y representado son sustancialmente similares.
I_Imagen
getTamao() dibujar()
Patrones de Diseo
100
50
Patrones de Diseo
Ernesto Pimentel
Representante: estructura
Los objetos representados pueden ser de distintos tipos y el proxy ofrece un acceso transparente. I_Imagen
getTamao() dibujar()
Imagen_BMP
...
Relacin con?
IDEAS 2007. Isla Margarita, Venezuela
Patrones de Diseo
101
El patrn Visitante
Patrn de comportamiento de objetos que representa una operacin a aplicar sobre los objetos de una estructura. Permite definir nuevas operaciones sin cambiar las clases de los elementos sobre los que opera. Da prioridad a la descomposicin funcional sobre la orientada a objetos.
A.Y.O.R
Patrones de Diseo
102
51
Patrones de Diseo
Ernesto Pimentel
Visitante: motivacin
Ejemplo: un compilador
representa programas mediante grafos sintcticos varios tipos de nodos:
variables asignaciones operaciones aritmticas, ... anlisis de flujo generacin de cdigo
Patrones de Diseo
103
pretty printing
ASSIGN
ARITH.
Patrones de Diseo
104
52
Patrones de Diseo
Ernesto Pimentel
Variable
Assignment
Arithmetic
Patrones de Diseo
105
Problemas: Una nueva operacin obliga a tocar todo. Si la cohesin entre operaciones es baja, los problemas de acoplamiento superan las ventajas. Clases complejas y contaminadas por operaciones particulares.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
106
53
Patrones de Diseo
Ernesto Pimentel
Visitante: estructura
Clase visitante, con una subclase por cada nodo.
Visitor visitVar(Node) visitAssign(Node) visitArith(Node)
TCVisitor
CGVisitor
FAVisitor
...
Visitante: estructura
Las clases nodo aceptan la visita (callback ).
Node
accept(Visitor)
Variable
Assignment
Arithmetic
accept(Visitor v)
accept(Visitor v)
accept(Visitor v)
accept(Visitor v) { v.visitVar(this); }
accept(Visitor v) { v.visitAssign(this); }
accept(Visitor v) { v.visitArith(this); }
Patrones de Diseo
108
54
Patrones de Diseo
Ernesto Pimentel
Variable TCVisitor CGVisitor ... FAVisitor accept(Visitor v) visitVar(Node) visitAssign(Node) visitArith(Node) visitVar(Node) visitAssign(Node) visitArith(Node) visitVar(Node) visitAssign(Node) visitArith(Node)
Assignment
Arithmetic
accept(Visitor v)
accept(Visitor v)
Visitante: funcionamiento
Quin se encarga de recorrer la estructura? La propia estructura
recibe un visitante e invoca accept() sobre cada nodo
El visitante
obliga a duplicar el cdigo de recorrido
vlido para recorridos dependientes de la operacin concreta
Un iterador
Interno a la estructura
se evita el double dispatching:
v.visit(node);
Externo
fcil de implementar si la operacin es simple (no recursiva)
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
110
55
Patrones de Diseo
Ernesto Pimentel
Visitante simula el double dispatch en L.O.O. permite aadir operaciones a una clase sin cambiarla.
la interfaz se extiende mediante una nueva subclase de Visitor, en vez de muchas nuevas subclases de Node.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
111
Visitante: conclusiones
Extensibilidad
sencilla para operaciones, ms dificultosa para nodos
56