Sei sulla pagina 1di 56

Patrones de Diseo

Ernesto Pimentel

Ernesto Pimentel ernesto@uma.es Universidad de Mlaga

Patrones de Diseo

IDEAS 2007. Isla de Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

IDEAS 2007. Isla de Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

IDEAS 2007. Isla de Margarita, Venezuela

Patrones de Diseo

Ernesto Pimentel

Patrones de diseo vs. Marcos de trabajo


Ambos son complementarios. Los patrones de diseo:
Cubren el hueco entre las bibliotecas de clases y los marcos de trabajo. Presentan una granularidad ms fina que los marcos de trabajo. Son ms abstractos que los marcos de trabajo.
Marco de trabajo

Patrn de diseo

Los marcos de trabajo:


Suele estar compuestos por una coleccin de patrones de diseo.
Biblioteca de clases
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo

Ventajas de los patrones de diseo (I)


Son soluciones concretas:
Un catlogo de patrones es un conjunto de recetas de diseo. Aunque se pueden clasificar, cada patrn es independiente del resto. Dada una determinada situacin, los patrones indican cmo resolverla mediante un D.O.O. Existen patrones especficos para un lenguaje determinado, y otros de carcter ms general. Proceden de la experiencia. Han demostrado su utilidad para resolver problemas que aparecen frecuentemente en el D.O.O.

Son soluciones tcnicas:

Se aplican en situaciones muy comunes:

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

IDEAS 2007. Isla de Margarita, Venezuela

Incremento de la reutilizacin
5 6

Patrones de Diseo

Ernesto Pimentel

Ventajas de los patrones de diseo (II)


Son soluciones simples:
Indican cmo resolver un problema particular utilizando un pequeo nmero de clases relacionadas de forma determinada. No indican cmo disear un sistema completo, sino slo aspectos puntuales del mismo.

Facilitan la reutilizacin de las clases y del propio diseo:


Los patrones favorecen la reutilizacin de clases ya existentes y la programacin de clases reutilizables. La propia estructura del patrn es reutilizada cada vez que se aplica.

IDEAS 2007. Isla Margarita, Venezuela

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:

Es difcil reutilizar la implementacin de un patrn:

Los patrones suponen cierta sobrecarga de trabajo a la hora de implementar:


Se usan ms clases de las estrictamente necesarias. A menudo un mensaje se resuelve mediante delegacin de varios mensajes a otros objetos. ...

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

IDEAS 2007. Isla de Margarita, Venezuela

Patrones de Diseo

Ernesto Pimentel

MVC: Un ejemplo de patrn


En Smalltalk-80 se utiliza una relacin entre clases denominada MVC (Modelo/Vista/Control), que se repite en otras muchas situaciones, y que se ha utilizado desde entonces para interfaces grficas de usuario. MVC se puede considerar como un ejemplo tpico de patrn de diseo. Se utiliza para construir interfaces de usuario distinguiendo tres tipos de objetos:

El objetivo es independizar las distintas componentes del sistema.

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

MVC: Combinacin de patrones


En realidad, aunque MVC se puede presentar como un patrn de diseo en s mismo, es el resultado de la combinacin de varios patrones:

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

IDEAS 2007. Isla Margarita, Venezuela

IDEAS 2007. Isla de Margarita, Venezuela

Patrones de Diseo

Ernesto Pimentel

Clasificacin de los patrones de diseo


Segn su propsito:

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

11

Catlogo de Gamma et al.


PROPSITO
CREACIN
CLASE

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

IDEAS 2007. Isla Margarita, Venezuela

IDEAS 2007. Isla de Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

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

IDEAS 2007. Isla de Margarita, Venezuela

Patrones de Diseo

Ernesto Pimentel

Adaptador: motivacin
ObjetoGrfico EditorGrfico dibujar( ) editar( ) draw( ) edit( ) Text

Lnea dibujar( ) editar( )

Crculo dibujar( ) editar( )

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

15

Adaptador: versin para instancias


ObjetoGrfico EditorGrfico dibujar( ) editar( ) draw( ) edit( )
text

Text

Lnea dibujar( ) editar( )

Crculo dibujar( ) editar( )

Texto dibujar( ) editar( )


dibujar( ) { text.draw( ); } editar( ) { text.edit( ); }

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

16

IDEAS 2007. Isla de Margarita, Venezuela

Patrones de Diseo

Ernesto Pimentel

Adaptador: versin para clases


ObjetoGrfico EditorGrfico dibujar( ) editar( ) draw( ) edit( ) Text

Lnea dibujar( ) editar( )

Crculo dibujar( ) editar( )

Texto dibujar( ) editar( )


dibujar( ) { draw( ); } editar( ) { edit( ); }

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

17

El patrn Adaptador
Es un patrn de diseo estructural con dos versiones:
Cliente Objetivo Adaptado

+ mtodo()

+mtodoEspecifico() adapt

Adaptador

+mtodo() mtodo() { adapt. mtodoEspecfico(); }


Patrones de Diseo

IDEAS 2007. Isla Margarita, Venezuela

18

IDEAS 2007. Isla de Margarita, Venezuela

Patrones de Diseo

Ernesto Pimentel

Adaptador: algunas consideraciones


La versin con herencia (clases):
No funciona cuando se quiere adaptar una clase y sus subclases. Introduce solo un objeto, y no se necesita ninguna referencia adicional para acceder al objeto adaptado. Permite redefinir parte del comportamiento de la clase adaptada, pues el adaptador es una subclase suya.

La versin con delegacin (objetos):


Permite adaptar una clase y sus subclases. El adaptador puede aadir funcionalidad a todos los adaptados de una vez. Complica la redefinicin del comportamiento de la clase adaptada, pues ello requerira crear un descendiente de dicha clase, y adaptar esta otra clase en vez de la original.

El tipo de adaptacin puede ser muy variado:


Desde una simple conversin de interfaces (por ejemplo, cambiar los nombres de las operaciones), Hasta aadir un conjunto totalmente diferente de operaciones.

Relacionado con otros patrones: Puente, Decorador, Representante


IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
19

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.

Proporciona un mecanismo global de acceso a dicha instancia. Ejemplos:


contadores para asignar identificadores. controladores de colas de impresin. clases que representen tipos univaluados. representacin de clases como instancias de metaclases.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

20

IDEAS 2007. Isla de Margarita, Venezuela

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.

Para ello se puede utilizar una variable global


pero esto no evita que se puedan crear varias instancias.

Una solucin mejor es que la propia clase


controle la creacin de esa nica instancia proporcione un acceso global a la misma.

IDEAS 2007. Isla Margarita, Venezuela

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

El acceso a dicha variable


se har a travs de un mtodo de clase (esttico), que devolver una referencia a la instancia.

La creacin de la instancia
se har la primera vez que se invoque este mtodo.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

22

IDEAS 2007. Isla de Margarita, Venezuela

11

Patrones de Diseo

Ernesto Pimentel

El patrn Singular
Instancia (...) { if (instancianica == null) instancianica = new Singular(...); return instancianica; }

Singular -instancianica:Singular +Instancia() : Singular - Singular()

El constructor debe ser privado.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

23

Singular: implementacin en Java


class Singular { private static Singular instancianica; ... // declaracin de atributos private Singular(...) { ... // inicializacin de atributos } public static Singular Instancia() { if (instancianica == null) instancianica = new Singular(...); return instancianica; } ... // mtodos de instancia }

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

24

IDEAS 2007. Isla de Margarita, Venezuela

12

Patrones de Diseo

Ernesto Pimentel

El patrn Singular y la genericidad


Dificultades de aplicar el esquema en el caso de tener clases genricas:
Imposibilidad de explicitar el tipo genrico en las entidades estticas, lo que implica situaciones de inseguridad del sistema de tipos. Solucin basada en reflexin. Solucin basada en otro patrn: Prototipo.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

25

El patrn Fbrica Abstracta


Patrn de creacin de objetos. Proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar las clases concretas de las que son instancia.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

26

IDEAS 2007. Isla de Margarita, Venezuela

13

Patrones de Diseo

Ernesto Pimentel

Fbrica Abstracta: motivacin


Consideremos un juego de herramientas para construir interfaces de usuario que soporte mltiples estndares look-and-feel:
Diferentes look-and-feel definen diferentes aspectos (colores, figuras, tipos de letra, etc.) y comportamientos (botones, mens, barras de scroll, ventanas, etc.) Por ejemplo: Motif, Presentation Manager, Open Windows, etc.

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

27

Una solucin ingenua


if (API.equals(Motif) { MotifWindow mw = new MotifWindow(Aceptar); MotifButton mb1 = new MotifButton(SI); MotifButton mb2 = new MotifButton(NO); mw.add(mb1); mw.add(mb1); } else if (API.equals(OW) { OWWindow ow = new OWWindow(Aceptar); OWButton ob1 = new OWButton(SI); OWButton ob2 = new OWButton(NO); ow.add(ob1); mw.add(ob1); } else if (API.equals(PM) { } Repeticin del mismo

String API; API = // Valor inicial

esquema a lo largo del cdigo Dificultades de reutilizacin y extensin


Patrones de Diseo
28

IDEAS 2007. Isla Margarita, Venezuela

IDEAS 2007. Isla de Margarita, Venezuela

14

Patrones de Diseo

Ernesto Pimentel

Una solucin algo menos ingenua?


Window w; Button b1,b2; if (API.equals(Motif) { w = new MotifWindow(Aceptar); b1 = new MotifButton(SI); b2 = new MotifButton(NO); } else if (API.equals(OW) { w = new OWWindow(Aceptar); b1 = new OWButton(SI); b2 = new OWButton(NO); } else if (API.equals(PM) { } w.add(b1); w.add(b1);

String API; API = // Valor inicial

IDEAS 2007. Isla Margarita, Venezuela

Aprovechamos la jerarqua de clases entre componentes Polimorfismo sobre los datos Vinculacin dinmica Patrones de Diseo 29

Fbrica Abstracta: solucin


Definicin de una clase abstracta FbricaComponente que declara una interfaz para crear cada tipo bsico de componente:
crearVentana() crearBotn() crearMen() Ventana Botn BarraScroll

Para cada tipo de componente se define tambin una clase abstracta:

La clase FbricaComponente se desglosa en distintas factoras, una para cada tipo de look-and-feel:
FbricaMotif FbricaPM FbricaOW

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

30

IDEAS 2007. Isla de Margarita, Venezuela

15

Patrones de Diseo

Ernesto Pimentel

Fbrica Abstracta: aplicacin


FbricaComponente
crearVentana():Ventana crearBotn():Botn crearScroll():BarraScrolll

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

Una solucin algo menos ingenua?


Window w; Button b1,b2; w = fbrica.crearVentana(Aceptar); b1 = fbrica.crearBotn(SI); b2 = fbrica.crearBotn(NO); w.add(b1); w.add(b1); FbricaComponente API; API = new // Valor inicial

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

IDEAS 2007. Isla de Margarita, Venezuela

16

Patrones de Diseo

Ernesto Pimentel

El patrn Fbrica Abstracta


FbricaAbstracta
crearVentana():Ventana crearBotn():Botn crearScroll():BarraScrolll

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

Fbrica Abstracta: algunas consideraciones


Normalmente, slo se necesita una instancia de cada fbrica concreta: Este patrn ayuda a controlar las clases de objetos que crea una aplicacin. Dado que la responsabilidad de crear objetos se encapsula en las factoras, los clientes se mantienen aislados de las clases de implementacin. Facilita el intercambio de familias de productos. La clase de una fbrica concreta aparece slo una vez en cada aplicacin. La extensin de fbricas abstractas para producir nuevos tipos de productos no es fcil. Esto se debe a que la interfaz de FbricaAbstracta fija el conjunto de productos que pueden crearse:
Cuando existe un ascendente comn a todos los productos, este inconveniente se puede resolver mediante casting; Sin embargo, si la naturaleza de los nuevos objetos a crear es sustancialmente distinta, la reutilizacin se ve comprometida. las fbricas pueden definirse como singulares (aplicacin del patrn Singular).

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

IDEAS 2007. Isla de Margarita, Venezuela

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

Permite que un objeto cambie su comportamiento


cuando cambia su estado interno, tal y como si el objeto cambiase de clase.

Permite emular el mtodo becomes: de Smalltalk


en aquellos lenguajes donde no est disponible.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
35

Estado: motivacin (I)


Supongamos una clase Buffer1 que representa un buffer de tamao 1, con mtodos: put y get para introducir y extraer elementos, reset para vaciar el buffer. Supongamos que la extraccin de elementos de un buffer vaco y la insercin en un buffer lleno produce una excepcin. get / exception

vaco get, reset lleno put / exception put

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

36

IDEAS 2007. Isla de Margarita, Venezuela

18

Patrones de Diseo

Ernesto Pimentel

Estado: motivacin (II)


class Buffer1<Elem> { enum Estado {vaco,lleno); private Estado est; ... public void reset() { if (est == Estado.lleno) get(); } public void put(Elem e) { if (est == Estado.vaco) { almacenar(e); est = Estado.lleno; } else throw new RuntimeException(Buffer lleno); } ... // De forma similar para get() }
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
37

Estado: motivacin (III)


Supongamos una clase Buffer2 con comportamiento similar a la anterior con capacidad de almacenar hasta dos elementos.

get / exception put vaco reset lleno put / exception


IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
38

uno get, reset get put

IDEAS 2007. Isla de Margarita, Venezuela

19

Patrones de Diseo

Ernesto Pimentel

Estado: motivacin (IV)


class Buffer2<Elem> extends Buffer1<Elem> { enum Estado {vaco,uno,lleno); private Estado est; ... public void reset() { if (est == Estado.uno) get(); else if (est == Estado.lleno) { get(); get(); } } public void put(Elem e) { if (est == Estado.vaco) { almacenar(e); est = Estado.uno; } else if (est == Estado.uno) { almacenar(e); est = Estado.lleno; } else throw new RuntimeException(Buffer lleno); } ... // De forma anloga para get() }
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
39

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

40

IDEAS 2007. Isla de Margarita, Venezuela

20

Patrones de Diseo

Ernesto Pimentel

Estado: ejemplo de aplicacin


Buffer1 1 +get():void +put():void contexto estado 1 +get():void +put():void Estado

void put(...) { estado.put(); }

Vaco

Lleno

+get():void +put():void Buffer2 Vaco2

+get():void +put():void

Lleno2

Uno

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

41

El patrn Estado
Contexto 1 +mtodo(args) +cambiarEstado(Estado) contexto estado 1 +mtodo(,Contexto) Estado

Estado1 void mtodo(args) { estado.mtodo(args,this); }

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

IDEAS 2007. Isla de Margarita, Venezuela

21

Patrones de Diseo

Ernesto Pimentel

Estado: algunas consideraciones


Los mtodos de las subclases de Estado deben acceder a los atributos del objeto Contexto:
en particular, ser necesario ir cambiando de estado. hay que aadir un argumento adicional (this) para hacer referencia al objeto Contexto.

Toda la interfaz del Contexto debe delegarse al objeto estado:


void put(Elem e) {estado.put(e,this);}

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

44

IDEAS 2007. Isla de Margarita, Venezuela

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

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

46

IDEAS 2007. Isla de Margarita, Venezuela

23

Patrones de Diseo

Ernesto Pimentel

El patrn Estrategia
Estrategia Contexto estrategia

algoritmo()

aplicarAlgoritmo()

EstrategiaA

EstrategiaB

EstrategiaC

algoritmo()

algoritmo()

algoritmo()

estrategia.algoritmo()

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

47

Estrategia: algunas consideraciones


La jerarqua de las clases Estrategia define una familia de algoritmos o comportamientos para ser reutilizados por el contexto. La herencia puede ayudar a organizar la funcionalidad comn de los algoritmos. Las estrategias eliminan la necesidad de utilizar construcciones condicionales para seleccionar el comportamiento deseado. Las estrategias pueden proporcionar diferentes implementaciones a un mismo comportamiento. La interfaz de Estrategia es compartida por todas las clases que determinan estrategias concretas, ya sean estas simples o complejas. Por lo tanto, es probable que algunas estrategias concretas no utilicen toda la informacin pasada a travs de esa interfaz (incluso, puede ocurrir que estrategias simples no utilicen nada de dicha informacin). Las estrategias incrementan el nmero de objetos en una aplicacin; a veces se puede reducir esta sobrecarga implementando estrategias como objetos sin estado que los contextos pueden compartir (patrn Singular).
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
48

IDEAS 2007. Isla de Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

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

IDEAS 2007. Isla de Margarita, Venezuela

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

a = 50% b = 30% c = 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

0..n suscribir(Observador) darBaja(Observador) for each o in obs { notificar() o.actualizar();

actualizar()

DiagramaBarras
Datos

estadoBarras actualizar() dat DiagramaSectores estadoSectores actualizar()

HojaClculo estadoHoja actualizar()

estadoDatos getEstado() setEstado()

return estadoDatos
IDEAS 2007. Isla Margarita, Venezuela

return estadoBarras= dat.getEstado();


Patrones de Diseo
52

IDEAS 2007. Isla de Margarita, Venezuela

26

Patrones de Diseo

Ernesto Pimentel

El patrn Observador
Observable

obs 0..n
for each o in obs { o.actualizar(); }

Observador

suscribir(Observador) darBaja(Observador) notificar()

actualizar()

ObservableConcreto

ObservadorConcreto observable estadoObservador actualizar()


return estadoObservador = observable.getEstado();
Patrones de Diseo
53

estadoObservable getEstado() setEstado()

return estadoObservable
IDEAS 2007. Isla Margarita, Venezuela

El patrn Observador: interaccin


unObservableConcreto unObservadorConcreto
setEstado()

otroObservadorConcreto

notificar()

actualizar() getEstado() actualizar() getEstado()

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

54

IDEAS 2007. Isla de Margarita, Venezuela

27

Patrones de Diseo

Ernesto Pimentel

Observador: algunas consideraciones Se aplica cuando:


una abstraccin tiene ms de un aspecto, unos dependientes de otros, se desea reutilizar cada uno de ellos independientemente de los otros. el cambio de un objeto require cambiar los otros, y no se sabe cuntos objetos deben actualizarse. un objeto debe notificar ciertos cambios a otros, pero sin saber quines son dichos objetos.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

55

Observador: algunas consideraciones


El acoplamiento entre observables y observadores es abstracto y mnimo. La notificacin se realiza mediante una difusin en la que el objeto observado no tiene que conocer la identidad de los observadores. A veces se puede producir un problema de actualizaciones inesperadas en cascada. Registro de observadores en los observables a travs de estructuras asociativas (p.e. tablas hash) cuando hay muchos observables y pocos observadores. A veces puede interesar asociar a un mismo observador varios observables: en estos casos puede ser necesario pasar el objeto observado cuando ste notifica un cambio a los observadores.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
56

IDEAS 2007. Isla de Margarita, Venezuela

28

Patrones de Diseo

Ernesto Pimentel

Observador: algunas consideraciones


Mecanismo de notificacin:
Cada cambio de estado puede disparar una notificacin: poltica simple, pero puede provocar cascadas de actualizaciones. El propio objeto observado decide qu cambios son relevantes para ser notificados. Un protocolo de notificacin que enva a cada observador la informacin que necesita (a travs de parmetros adicionales de la operacin actualizar: alto acoplamiento entre observable y observadors, y baja reutilizacin. Un protocolo de notificacin que slo advierte a los observadores de la existencia de cambios; cada observador debe ser capaz de saber qu informacin relevante es la que ha cambiado: ineficiencia. Al suscribir un observador a un observable puede ser interesante especificar qu tipo de aspectos pueden serle relevantes. En algunas libreras de clases (java.swing) se organizan jerarquas de este tipo de aspectos (XxxxListener)
Patrones de Diseo
57

Es conveniente evitar notificaciones especficas para observadores concretos, y llegar a un compromiso entre:

Suscripcin especializada de observadores:

IDEAS 2007. Isla Margarita, Venezuela

Observador: algunas consideraciones


Encapsulamiento de actualizaciones complejas cuando las relaciones entre observados y observadores es compleja:
Varios objetos observados pueden estar estrechamente relacionados entre s. Las notificaciones a los observadores deben realizarse slo despus de que observables relacionados queden en un estado consistente.

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

IDEAS 2007. Isla Margarita, Venezuela

IDEAS 2007. Isla de Margarita, Venezuela

29

Patrones de Diseo

Ernesto Pimentel

El patrn Observador: gestor de cambios


Observable

observables

Observador

suscribir(Observador o) darBaja(Observador) notificar()


gestor.notificar() gestor.suscribir(this,o)

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

GestorCambiosDAG notificar() GestorCambiosSimple notificar()


IDEAS 2007. Isla Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

60

IDEAS 2007. Isla de Margarita, Venezuela

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

IDEAS 2007. Isla Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

62

IDEAS 2007. Isla de Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

63

Prototipo: aplicacin
Tool Graphic

manipular()

prototipo dibujar(Posicin)
clone()

RotateTool manipular()

GraphicTool manipular() Nota dibujar(Posicin) clone():Nota

p = prototipo.clone(); while (user arrastra ratn) { p.dibujar(new posicin); } insetar p en el grfico


IDEAS 2007. Isla Margarita, Venezuela

return copia de this

Patrones de Diseo

64

IDEAS 2007. Isla de Margarita, Venezuela

32

Patrones de Diseo

Ernesto Pimentel

El patrn Prototipo
Cliente

prototipo Prototipo
clone()

operacin()

PrototipoConcreto1 p = prototipo.clone(); clone()

PrototipoConcreto2 clone()

return copia de this

return copia de this

IDEAS 2007. Isla Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

66

IDEAS 2007. Isla de Margarita, Venezuela

33

Patrones de Diseo

Ernesto Pimentel

El patrn Plantilla de Mtodos


Patrn de comportamiento para clases. Define el esqueleto de un algoritmo en una operacin, retrasando la implementacin de parte de los pasos a las subclases. El patrn hace que las subclases redefinan ciertos pasos de un algoritmo sin cambiar la estructura global del mismo.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

67

Plantilla de Mtodos: motivacin


Supongamos que queremos extraer informacin de una fuente externa (p.ej. un fichero), y los datos son tratados y almacenados en una estructura interna. El problema surge en que la forma de tratamiento, puede variar de clases que an no conocemos, o que pueden variar en el futuro. Codificar un tratamiento inicial directamente en el algoritmo de lectura puede comprometer el diseo en el futuro.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
68

IDEAS 2007. Isla de Margarita, Venezuela

34

Patrones de Diseo

Ernesto Pimentel

El patrn Plantilla de Mtodos


// Obtencin Datos tratamiento(Datos) almacenamiento(DatosT) LectorDatos

lectura(Fichero) tratamiento() almacenamiento()

fil.filtrado(Datos)

Decodificador

LectorCodificado

LectorFiltro

Filtro

decode(Datos)

tratamiento(Datos)

tratamiento(Datos)

fil

filtrado(Datos)

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

69

El patrn Plantilla de Mtodos


ClaseAbstracta

mtodoPlantilla()

operacinPrimitiva1() operacinPrimitiva2()

operacinPrimitiva1() operacinPrimitiva2()

ClaseConcreta

operacinPrimitiva1() operacinPrimitiva2()

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

70

IDEAS 2007. Isla de Margarita, Venezuela

35

Patrones de Diseo

Ernesto Pimentel

Plantilla de Mtodos: consideraciones


Se puede aplicar:
Para implementar las partes invariantes de un algoritmo, dejando a las subclases implementar el comportamiento que puede variar. Cuando el comportamiento comn entre subclases debe ser factorizado y localizado en una clase comn para evitar duplicacin de cdigo.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

71

El patrn Cadena de Mando


Patrn de comportamiento para objetos. Disminuye el acoplamiento entre el emisor de una peticin y el receptor que finalmente la atiende. Se consigue dando a ms de un objeto la oportunidad de responder a la peticin. Los objetos receptores se encadenan y se van pasando la peticin hasta que uno de ellos la atiende.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

72

IDEAS 2007. Isla de Margarita, Venezuela

36

Patrones de Diseo

Ernesto Pimentel

Cadena de Mando: motivacin (I)


Consideremos un sistema de ayudas sensible al contexto en una interfaz grfica de usuario:
El usuario puede obtener informacin ayuda sobre cualquier parte de la interfaz situndose sobre ella. La ayuda que se obtiene depende de la parte de la interfaz sobre la que se solicita y su contexto: p. ej., la ayuda que ofrece el botn de una ventana de dilogo puede no ser la misma que la que se asocia a un botn de la ventana principal de la aplicacin. Si no existe ayuda especfica sobre elemento del que se solicita (un botn, p.ej.), el sistema debera ofrecer un mensaje de ayuda ms general sobre el contexto inmediato (la ventana de dilogo, p.ej.)

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

Cadena de Mando: motivacin (II)


La idea del patrn es desacoplar los emisores de los receptores dando a diferentes objetos la posibilidad de atender peticiones. La peticin se va pasando de un objeto a otro a lo largo de una cadena de mando hasta que uno de ellos la atiende:
unDilogoSave unBotnPrint ayuda unBotnOK ayuda
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
74

ayuda unDilogoPrint ayuda

unaAplicacin ayuda

IDEAS 2007. Isla de Margarita, Venezuela

37

Patrones de Diseo

Ernesto Pimentel

Cadena de Mando: aplicacin


ayuda
Ayuda

pedirAyuda()

ayuda.pedirAyuda();

Aplicacin

Componente

Dilogo

Botn

pedirAyuda() mostrarAyuda()
IDEAS 2007. Isla Margarita, Venezuela

if (this tiene ayuda) { mostrarAyuda(); } else { super.pedirAyuda(); }


Patrones de Diseo
75

El patrn Cadena de Mando


superior
Gestor

peticin()

superior.peticin();

GestorConcreto1

GestorConcreto2

peticin()

peticin()
if (this atiende peticin) { } else { super.peticin(); }

acciones

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

76

IDEAS 2007. Isla de Margarita, Venezuela

38

Patrones de Diseo

Ernesto Pimentel

Cadena de Mando: consideraciones


Este patrn libera a un objeto de conocer quin atiende sus peticiones: el objeto slo tiene que confiar en que la peticin se tratar adecuadamente. Sin embargo, nada lo garantiza: si la peticin no se atiende al final de la cadena, o sta no est bien configurada. Ni el emisor ni el receptor tienen conocimiento explcito uno de otro: en vez de mantener referencias a todos los receptores, el emisor slo mantiene una referencia a su sucesor. Habitualmente, en los casos susceptibles de aplicar este patrn, los enlaces que establecen la cadena de mando ya existen: patrn Compuesto o Decorador.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
77

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

78

IDEAS 2007. Isla de Margarita, Venezuela

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

IDEAS 2007. Isla Margarita, Venezuela

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

IDEAS 2007. Isla de Margarita, Venezuela

40

Patrones de Diseo

Ernesto Pimentel

El patrn Mediador
mediador
Mediador Componente

CompConcreto1 MediadorConcreto

CompConcreto2

IDEAS 2007. Isla Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

82

IDEAS 2007. Isla de Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

83

Decorador: solucin
Componente operacin() { componente.operacin(); }

+operacin():

componente

ComponenteConcreta

Decorador

+operacin():

+operacin ():

operacin(){ super.operaci(); comportamientoAdicional(); }

DecoradorConcreto1

DecoradorConcreto2

DecoradorConcretoN

+operacin(): +operacin(): +operacin(): +comportamientoAdicional ():


Patrones de Diseo
84

IDEAS 2007. Isla Margarita, Venezuela

IDEAS 2007. Isla de Margarita, Venezuela

42

Patrones de Diseo

Ernesto Pimentel

Decorador: ejemplo de aplicacin (I)


El paquete java.io de Java constituye un excelente ejemplo del patrn Decorador. Las jerarqua de clases cuya raz es la clase abstracta OutputStream permite la combinacin de filtros (FilterOutputStream) para combinar funciones diversas:
salida sobre ficheros, utilizando un buffer, manipulando directamente datos bsicos Java.

De forma anloga se organiza la jerarqua InputStream.


DataOutputStream BufferedOutputStream FileOutputStream Fichero binario bytes bytes DataInputStream BufferedInputStream FileInputStream

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

85

Decorador: ejemplo de aplicacin (II)


OutputStream write() { out.write(); } out

+write() FileOutputStream

+write() FileOutputStream

FilterOutputStream

write(){ // versin especialzada;

+write() +write()

DataOutputStream

BufferedOutputStream

PrintStream

+write()

+write()

+write()

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

86

IDEAS 2007. Isla de Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

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

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

88

IDEAS 2007. Isla de Margarita, Venezuela

44

Patrones de Diseo

Ernesto Pimentel

Compuesto: ejemplo de aplicacin


Component * 2

paint() { // Dibuja componente derecha // Dibuja componente izquierda }

Container

JComponent

JScrollPane

1 JSplitPane

JComboBox

JLabel

paint()

JTabbedPane

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

89

Compuesto: solucin
Componente

*
+operacin(): comp

operacin() { for (Componente c : comp) c.operacin(); }

ComponenteConcreta1

Compuesto

+operacin(): ComponenteConcreta2

+operacin ():

+operacin(): ComponenteConcretaN

+operacin():
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
90

IDEAS 2007. Isla de Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

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.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

92

IDEAS 2007. Isla de Margarita, Venezuela

46

Patrones de Diseo

Ernesto Pimentel

Iterador: ejemplo de aplicacin


En Java se utiliza este patrn para iterar sobre colecciones.
Cliente

Collection

Iterator

+add(elem:Object):boolean +isEmpty():boolean +contains(elem:Object):boolean

+next():Object +hastNext():boolean +remove():void

<< implementation >>

List

ListIterator

<< implementation>>

+previous():Object

BeanContextSupport

BCSIterator

IDEAS 2007. Isla Margarita, Venezuela

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

IDEAS 2007. Isla de Margarita, Venezuela

47

Patrones de Diseo

Ernesto Pimentel

Representante: primera aproximacin


Utilizamos un puntero nulo para hacer referencia a la imagen cuando no est an cargada.
:Documento imagen

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

El mecanismo bsico utilizado es la delegacin.


IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
96

IDEAS 2007. Isla de Margarita, Venezuela

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

El estado de la imagen (cargada o no) es transparente al editor.


IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
97

dibujar() { if (imagen == null) imagen = Imagen.Load(fichero); imagen.dibujar(); }

Representante: tipos de proxies


Proxy remoto Proxy virtual
Proporciona un representante local a un objeto remoto, ocultando que cliente y representado residen en espacios de direcciones distintos. Permite crear objetos pesados bajo demanda
Ej. copy-on-write

Proxy de proteccin

Controla el acceso al objeto representado

Ej. gestin de permisos de acceso (en Eiffel)

Referencia inteligente

Reemplaza a un puntero para permitir funciones adicionales


Ej. recoleccin de basura, bloqueo/desbloqueo, persistencia...

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

98

IDEAS 2007. Isla de Margarita, Venezuela

49

Patrones de Diseo

Ernesto Pimentel

Representante: estructura
El proxy debe apuntar al objeto representado.
Representante imagen Imagen tamao Load(File) getTamao() dibujar()

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

99

Representante: estructura
Las interfaces de representante y representado son sustancialmente similares.
I_Imagen

getTamao() dibujar()

Representante imagen tamao getTamao() dibujar()

Impl_Imagen tamao Load(File) getTamao() dibujar()

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

100

IDEAS 2007. Isla de Margarita, Venezuela

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

Representante imagen tamao getTamao() dibujar()

Imagen_JPG tamao Load(File) getTamao() dibujar()

Imagen_BMP

...

tamao Load(File) getTamao() dibujar()

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

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

102

IDEAS 2007. Isla de Margarita, Venezuela

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

varias operaciones a realizar:


type checking pretty printing

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

103

Visitante: opciones de descomposicin


type checking
VAR anlisis de flujo generacin de cdigo

pretty printing

ASSIGN

ARITH.

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

104

IDEAS 2007. Isla de Margarita, Venezuela

52

Patrones de Diseo

Ernesto Pimentel

Visitante: descomposicin de datos


Agrupamos las mtodos en las clases sobre las que actan.
Node

// mtodos relativos a los nodos // de tipo Variable

typecheck() flowanalysis() ...

Variable

Assignment

Arithmetic

typecheck() flowanalysis() ...

typecheck() flowanalysis() ...

typecheck() flowanalysis() ...

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

105

Visitante: descomposicin de datos


Node typecheck() flowanalysis() ...

Variable typecheck() flowanalysis() ...

Assignment typecheck() flowanalysis() ...

Arithmetic typecheck() flowanalysis() ...

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

IDEAS 2007. Isla de Margarita, Venezuela

53

Patrones de Diseo

Ernesto Pimentel

Visitante: estructura
Clase visitante, con una subclase por cada nodo.
Visitor visitVar(Node) visitAssign(Node) visitArith(Node)

// funcionalidad especfica // de type checking

TCVisitor

CGVisitor

FAVisitor

visitVar(Node) visitAssign(Node) visitArith(Node)

visitVar(Node) visitAssign(Node) visitArith(Node)

...

visitVar(Node) visitAssign(Node) visitArith(Node)

Mayor cohesin del cdigo.


IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
107

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); }

IDEAS 2007. Isla Margarita, Venezuela

Patrones de Diseo

108

IDEAS 2007. Isla de Margarita, Venezuela

54

Patrones de Diseo

Ernesto Pimentel

Visitante: justificacin y utilidad


Visitor Node visitVar(Node) visitAssign(Node) visitArith(Node) accept(Visitor)

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)

La estructura puede contener objetos heterogneos


Node es una interfaz.

Las operaciones pueden ser heterogneas


distintos modos de uso de una estructura compartida.

Una nueva operacin no afecta a la estructura


Localizada en una nueva subclase de Visitor.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
109

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

IDEAS 2007. Isla de Margarita, Venezuela

55

Patrones de Diseo

Ernesto Pimentel

Visitante: temas relacionados


Visitante utiliza la tcnica del double-dispatch
single dispatch (tpico de L.O.O.)
la operacin invocada depende del nombre de la peticin y el tipo del objeto receptor.

double dispatch (lenguaje CLOS y otros)


la operacin invocada depende del nombre de la peticin y los tipos tanto del receptor como de (los) argumento(s).

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

Mayor cohesin funcional


cada visitante rene operaciones relacionadas y separa las que no lo estn. las estructuras especficas de un algoritmo se encapsulan en el visitante correspondiente. los visitantes pueden acumular estado fcilmente

Se rompe el encapsulamiento de objetos


Las operaciones visitantes deben acceder a los atributos de los nodos visitados.
IDEAS 2007. Isla Margarita, Venezuela Patrones de Diseo
112

IDEAS 2007. Isla de Margarita, Venezuela

56

Potrebbero piacerti anche