Professional Documents
Culture Documents
Juan Pavn Mestras Dep. Ingeniera del Software e Inteligencia Artificial Universidad Complutense Madrid
Disear software orientado a objetos es difcil, y disear software orientado a objetos reutilizable es todava ms difcil
Chapter 1: Introduction. Design Patterns, The Gang of Four
...y un software capaz de evolucionar tiene que ser reutilizable (al menos para las versiones futuras)
Patrones de creacin
Patrones de creacin
Sin embargo, para llegar a ser un maestro, hay que estudiar las partidas de otros maestros
Estas partidas contienen patrones que deben ser entendidos, memorizados y aplicados repetidamente
Patrones de creacin
Sin embargo, para llegar a ser un maestro, hay que estudiar los diseos de otros maestros
Estos diseos contienen patrones que deben ser entendidos, memorizados y aplicados repetidamente
Patrones de creacin
Patrones
Christopher Alexander (1977):
Cada patrn describe un problema que ocurre una y otra vez en nuestro entorno, y describe la esencia de la solucin a ese problema, de tal modo que pueda utilizarse esta solucin un milln de veces ms, sin siquiera hacerlo de la misma manera dos veces
Un patrn es:
una solucin a un problema en un contexto particular recurrente (lo que hace la solucin relevante a otras situaciones) ensea (permite entender cmo adaptarlo a la variante particular del problema donde se quiere aplicar) tiene un nombre para referirse al patrn
Los patrones facilitan la reutilizacin de diseos y arquitecturas software que han tenido xito
Patrones de creacin
Ayudan a la gente a comprender un sistema ms rpidamente cuando est documentado con los patrones que usa Los patrones pueden ser la base de un manual de ingeniera de software
Si el software se convierte en una ingeniera, las prcticas exitosas deben ser documentadas sistemticamente y ampliamente difundidas
Patrones de creacin
El software cambia
Para anticiparse a los cambios en los requisitos hay que disear pensando en qu aspectos pueden cambiar Los patrones de diseo estn orientados al cambio
Patrones de creacin
Clasificacin de patrones
Patrones arquitecturales
Expresan un paradigma fundamental para estructurar un sistema software Proporcionan un conjunto de subsistemas predefinidos, con reglas y guas para organizar las relaciones entre ellos
Patrones de diseo
Compuestos de varias unidades arquitecturales ms pequeas Describen el esquema bsico para estructurar subsistemas y componentes
Patrones de creacin
Ejemplos de patrones
Patrones arquitecturales
Jerarqua de capas Tuberas y filtros Cliente/Servidor Maestro-Esclavo Control centralizado y distribuido Proxies Factoras Adaptadores Composicin Broker
Patrones de diseo
Patrones de creacin
10
Patrones y Armazones
Los patrones de diseo tienen descripciones ms abstractas que los armazones
Las descripciones de patrones suelen ser independientes de los detalles de implementacin o del lenguaje de programacin (salvo ejemplos usados en su descripcin) Los armazones estn implementados en un lenguaje de programacin, y pueden ser ejecutados y reutilizados directamente
Los patrones de diseo son elementos arquitecturales ms pequeos que los armazones
Un armazn incorpora varios patrones Los patrones se pueden usar para documentar armazones
Patrones de creacin
11
Armazones (Frameworks)
Caractersticas
Un armazn ofrece un conjunto integrado de funcionalidad especfica de un dominio
P.ej.: aplicaciones financieras, servicios de telecomunicacin, sistemas de ventanas, bases de datos, aplicaciones distribuidas, ncleos de SO
Los armazones invierten el control en ejecucin entre la aplicacin y el software sobre el que est basada
El armazn determina qu mtodos se invocan en respuesta a eventos (se reusa el cdigo del cuerpo principal y se escribe el cdigo al que llama)
Patrones de creacin
12
GUI MATH
BUCLE DE EVENTOS
LGI CA ESPECFICA DE LA APLICACIN
invoca
ADTs
13
Controlador
Vista
visualizacin en pantalla
Modelo
aplicacin
Patrones de creacin
14
Problema y contexto
Cundo aplicar el patrn
Solucin
Estructura: elementos que conforman el diseo, sus relaciones, responsabilidades y colaboraciones
es una descripcin abstracta de cmo una disposicin de elementos (clases y objetos) solucionan el problema
Patrones relacionados
Patrones de creacin
15
Patrones estructurales
Tratan de desacoplar interfaz e implementacin de clases y objetos:
Cmo se componen clases y objetos?
Patrones de comportamiento
Tratan de las interacciones dinmicas entre sociedades de clases y objetos:
Cmo interaccionan y se distribuyen responsabilidades los objetos?
Patrones de creacin
16
Patrones de creacin
17
Patrones de creacin
18
Patrones de creacin
Patrones de creacin
En Java para crear un objeto se utiliza el operador new
unObjeto = new ClaseObjetos ();
Una clase Factora puede ocuparse de los detalles de qu clase de implementacin utilizar para crear un objeto de un tipo determinado
Factoria
new
:X
creaX()
XY
XZ
Selecciona la implementacin de X
Patrones de creacin
20
Patrones de creacin
Permiten que el sistema sea independiente de cmo se crean, componen o representan sus objetos
Sistemas ms dependientes de la composicin de objetos que de la herencia de clases
Se trata de que el comportamiento se defina ms por la composicin de un conjunto pequeo de comportamientos fundamentales que por la definicin mediante herencia de todos los comportamientos posibles Por tanto, la creacin de objetos es algo ms que instanciar una clase
Patrones de creacin
21
Patrones de creacin
Temas recurrentes en los patrones de creacin:
Encapsulan el conocimiento sobre las clases concretas que se van a utilizar Ocultan la manera de crear objetos de estas clases y cmo se juntan
La visin global de los objetos del sistema son sus interfaces (que pueden definirse como clases abstractas o interfaces)
Se da independencia de
qu se crea quin lo crea cmo se crea cundo se crea
Patrones de creacin
22
Patrones de creacin
Tipos de patrones de creacin
De clase: usa herencia para variar la clase del objeto creado
Factora abstracta
Factora para construir familias de objetos
Builder
Factora para construir objetos complejos de forma incremental
Prototype
Factora para clonar nuevos ejemplares copiando de un prototipo
Patrones de creacin
23
Mtodo Factora
Propsito:
Permite que una clase difiera la instanciacin a las subclases (son stas las que deciden qu clase instanciar)
Otras denominaciones:
Factory Method Virtual Constructor
Motivacin
Un armazn utiliza clases abstractas para definir y mantener relaciones entre objetos
El armazn tambin es responsable de crear esos objetos En principio el armazn no conoce las clases concretas que se van a definir en una aplicacin concreta El mtodo factora es un mtodo abstracto que encapsula el conocimiento de qu subclase se va a crear y pone este conocimiento fuera del armazn
Patrones de creacin
24
Mtodo Factora
Documento abrir() cerrar() salvar() restaurar() Aplicacion crearDocumento() nuevoDocumento() abrirDocumento() Documento doc = crearDocumento(); documentos.anadirDocumento(doc); doc.abrir();
Documento Grafico
Documento Textual
MiProcesadorTextos
Patrones de creacin
25
Mtodo Factora
Aplicacin
Cuando una clase no puede anticipar el tipo de objetos que debe crear Cuando una clase quiere que sus clases especifiquen los objetos que deben crear Cuando una clase delega la responsabilidad a una subclase de ayuda (entre varias), y se quiere localizar el conocimiento de qu subclase de ayuda es la delegada
Patrones de creacin
26
Mtodo Factora
Esquema, participantes y colaboraciones
El Creator deja que sus subclases definan el mtodo factora que construye y devuelve un objeto del ConcreteProduct apropiado
Declara el mtodo factora que devuelve un objeto de tipo Product. Puede definir una implementacin por defecto que devuelva un objeto ConcreteProduct
27
Mtodo Factora
Consecuencias
Elimina la necesidad de enlazar clases especficas de la aplicacin en el cdigo Es ms flexible crear un objeto con un mtodo factora que directamente
Un mtodo factora puede dar una implementacin por defecto, por ejemplo, para crear un archivo, mostrar un dilogo que permita abrir uno ya existente En este ejemplo el mtodo factora no es abstracto
Patrones de creacin
28
Mtodo Factora
Implementacin
Implementacin de la clase Creator
El mtodo factora es abstracto El mtodo factora proporciona una implementacin por defecto: Permite extensibilidad: se pone la creacin de objetos en una operacin separada por si el usuario quiere cambiarla
Patrones de creacin
29
Factora Abstracta
Propsito:
Proporcionar una interfaz para crear familias de objetos relaciones o dependientes, sin especificar sus clases concretas
Otras denominaciones:
Abstract Factory Kit
Motivacin
Definir una interfaz que soporte diferentes sistemas de ventanes, p.ej. Motif, Windows, Openview, ...
Patrones de creacin
30
JAVA L&F
Motif L&F
Windows L&F
Patrones de creacin
31
Factora Abstracta
Patrones de creacin
32
Factora Abstracta
Aplicacin
Para sistemas independientes de cmo se crean, componen y representan sus productos Para sistemas que pueden configurarse con una de varias familias de productos Para obligar a utilizar juntos objetos de una familia de productos Para ofrecer una librera de clases, mostrando slo sus interfaces y no sus implementaciones
Patrones de creacin
33
Factora Abstracta
Esquema, participantes y colaboraciones
FactoriaAbstracta Cliente CreaProductoA() CreaProductoB() ProductoAbstractoA
ProductoA1
ProductoA2
ProductoAbstractoB
ProductoB1
ProductoB2
Patrones de creacin
34
Factora Abstracta
Consecuencias
Se oculta a los clientes las clases de implementacin
los clientes manipulan los objetos a travs de las interfaces o clases abstractas
Patrones de creacin
35
Factora Abstracta
Implementacin
Factoras como singletons
En muchas ocasiones basta con una factora concreta por cada familia de productos
Creacin de productos:
Mtodo factora por cada producto: La factora abstracta slo define una interfaz para crear productos, y es la subclase factora concreta la que los crea. sta especificar sus productos redefiniendo el mtodo factora para cada uno. Prototipo para cada factora concreta Se crea la factora concreta inicializada con un objeto prototipo de cada producto. Los nuevos se crean haciendo clones del prototipo
Patrones de creacin
36
Aplicacin en Swing
Abstract factory : LookAndFeel Eleccin de la fbrica concreta : UIManager Producto abstracto : ComponentUI y sus clases derivadas (UIDelegate) Producto concreto : BasicListUI, MetalListUI Seleccin de apariencia en Swing private void seleccionarApariencia() { // Fuerza al sistema a adoptar una apariencia concreta String laf = UIManager.getSystemLookAndFeelClassName(); try { UIManager.setLookAndFeel(laf); } catch (UnsupportedLookAndFeelException exc) {System.err.println("Unsupported: " + laf);} catch (Exception exc) {System.err.println("Error loading " + laf);} }
Juan Pavn Mestras Facultad de Informtica UCM, 2004 Patrones de creacin
37
Builder
Propsito:
Permite a un cliente construir un objeto complejo especificando slo su tipo y contenido, ocultndole todos los detalles de la construccin del objeto
Patrones de creacin
38
Builder
Motivacin
Supongamos un editor que quiere convertir un tipo de texto (p.ej. RTF) a varios formatos de representacin diferentes, y que puede ser necesario en el futuro definir nuevos tipos de representacin
El lector de RTF(RTFReader) puede configurarse con una clase de Conversor de texto (TextConverter) que convierta de RTF a otra representacin A medida que el RTFReader lee y analiza el documento, usa el conversor de texto para realizar la conversin: cada vez que reconoce un token RTF llama al conversor de texto para convertirlo Hay subclases de TextConverter para cada tipo de representacin El conversor (builder) est separado del lector (director): se separa el algoritmo para interpretar un formato textual de cmo se convierte y se representa
Patrones de creacin
39
Builder
Patrones de creacin
40
Builder
Aplicacin
Cuando el algoritmo para crear un objeto complejo debe ser independiente de las partes que constituyen el objeto y cmo se juntan Cuando el proceso de construccin debe permitir representaciones diferentes para el objeto que se est construyendo
Patrones de creacin
41
Builder
Esquema y participantes
Interfaz para crear partes de un producto
Patrones de creacin
42
Builder
Colaboraciones
Patrones de creacin
43
Builder
Consecuencias
Permite variar la representacin interna de un producto
El Builder ofrece una interfaz al Director para construir un producto y encapsula la representacin interna del producto y cmo se juntan sus partes. Si se cambia la representacin interna basta con crear otro Bulider que respete la interfaz
Patrones de creacin
44
Builder
Implementacin y patrones relacionados
El Builder define las operaciones para construir cada parte
El ConcreteBuilder implementa estas operaciones
El objeto construido con el patrn Builder suele ser un Composite El Mtodo Factora se puede utilizar por el Builder para decidir qu clase concreta instanciar para construir el tipo de objeto deseado El patrn Visitor permite la creacin de un objeto complejo, en vez de paso a paso, dando todo de golpe como objeto visitante
Patrones de creacin
45
Singleton
Propsito:
Asegurar que una clase slo tiene un ejemplar, y proporcionar un punto de acceso global a ste
Motivacin
Algunas clases slo necesitan exactamente un ejemplar
Un spooler de impresin en un sistema, aunque haya varias impresoras Un slo sistema de archivos Un slo gestor de ventanas ...
En vez de tener una variable global para acceder a ese ejemplar nico, la clase se encarga de proporcionar un mtodo de acceso
Patrones de creacin
46
Singleton
Aplicacin
Cuando slo puede haber un ejemplar de una clase, y debe ser accesible a los clientes desde un punto de acceso bien conocido Cuando el nico ejemplar pudiera ser extensible por herencia, y los clientes deberan usar el ejemplar de una subclase sin modificar su cdigo
Patrones de creacin
47
Singleton
Esquema, participantes y colaboraciones
Los clientes acceden al ejemplar de Singleton nicamente a travs del mtodo Instance de la clase Singleton
Define un mtodo Instance( ) que permite a los clientes acceder al ejemplar Puede ser responsable de crear su ejemplar nico
return ejemplarUnico
Patrones de creacin
48
Singleton
Consecuencias
Acceso controlado a un ejemplar nico
Cmo y cuando los clientes pueden acceder al ejemplar
Patrones de creacin
49
Singleton
Implementacin
Definicin de la clase: asegurar que slo hay un ejemplar class Singleton { private static Singleton ejemplar = null; public static Singleton getEjemplar() { if ( ejemplar == null ) ejemplar = new Singleton(); return ejemplar; } protected Singleton() { // lo que sea necesario } public void metodo() {...}
}
Patrones de creacin
50
Singleton
Implementacin
Utilizacin:
Singleton instance = Singleton.getEjemplar(); // instance.metodo();
Patrones de creacin
51
Discusin
Hay dos maneras de parametrizar un sistema por las clases de objetos que crea:
Usando una subclase de la clase que crea los objetos:
Mtodo Factora
Requiere una nueva subclase por cada nuevo tipo de producto
Mediante composicin de objetos: un objeto es el responsable de conocer la clase de los objetos de producto:
Factora Abstracta, que puede producir objetos de varias clases Builder, que puede construir un producto complejo paso a paso Prototipo, construye un producto copia de otro prototipo
Son ms flexibles que el Mtodo Factora pero ms complejos de implementar
Patrones de creacin
52
Patrones estructurales
Patrones estructurales
Lo fundamental son las relaciones de uso entre objetos Se trata de conseguir que cambios en los requisitos de la aplicacin no ocasionen cambios en las relaciones entre los objetos Las relaciones de uso estn determinadas por las interfaces que soportan los objetos
Patrones de creacin
54
Patrones estructurales
Tipos de patrones estructurales
De clase: usa herencia para componer interfaces o implementaciones
Herencia mltiple: una clase que hereda de otras combina sus propiedades Class Adapter
Patrones de creacin
55
Adaptador
Propsito:
Convertir la interfaz de una clase en otra que esperan los clientes
Otras denominaciones:
Class Adapter y Object Adapter Wrapper (Envolvente)
Motivacin
Para reutilizar una clase de una biblioteca aunque su interfaz no correspondiera exactamente con el que requiere una aplicacin concreta
En el ejemplo, la clase TextView
Patrones de creacin
56
Adaptador
La clase TextShape adapta TextView a la interfaz Shape, de manera que el editor grfico DrawingEditor puede reutilizar la clase TextView, que de otra manera sera incompatible. TextShape se puede hacer de dos maneras:
1) Heredando la interfaz Shape y la clase TextView (Adaptador de clases) 2) Componiendo un objeto TextView en un TextShape, que se implementa utilizando el objeto TextView (Adaptador de objeto)
Patrones de creacin
57
Adaptador
Aplicacin
Para usar una clase existente cuya interfaz no se corresponde con el que se necesita Para crear una clase reutilizable que coopera con clases imprevistas (esto es, que no tienen necesariamente interfaces compatibles) El adaptador de objeto slo: para utilizar varias subclases existentes para las que sera poco prctico adaptar su interfaz heredando de cada una. Un adaptador de objeto puede adaptar la interfaz de su clase padre
Patrones de creacin
58
Adaptador
Esquema, participantes y colaboraciones (Adaptador de clase) Adaptador clase
Los clientes llaman a las operaciones de un objeto Adaptador. A su vez, el Adaptador llama a las operaciones heredadas de la clase Adaptada que tratan la peticin
Define una interfaz existente que necesita adaptacin Define la interfaz especfica al dominio que utiliza el cliente Adapta la interfaz de Adaptee a la interfaz Target
Patrones de creacin
59
Adaptador
Esquema, participantes y colaboraciones (Adaptador de objeto) Adaptador objeto
Los clientes llaman a las operaciones de un objeto Adaptador. A su vez, el Adaptador llama a las operaciones del Adaptado que tratan la peticin
Patrones de creacin
60
Adaptador
Consecuencias
Un adaptador de clase:
Adapta una clase Adaptada a una interfaz Objetivo reutilizando los mtodos de la clase Adaptada. Por tanto, no funcionar cuando se quieran adaptar la clase adaptada y todas sus subclases La clase adaptadora puede redefinir algunos de los mtodos de la clase adaptada Slo se introduce un objeto, y no hace falta delegar en otro adaptado
Un adaptador de objeto:
Permite trabajar un slo adaptador con muchos adaptados (esto es, de la clase adaptada y sus subclases) Se puede aadir funcionalidad a todos los adaptados de una vez Es ms difcil si se necesita redefinir el comportamiento del adaptado
Patrones de creacin
61
Bridge
Propsito:
Desacopla una abstraccin de su implementacin de manera que las dos puedan evolucionar independientemente
Otras denominaciones:
Handle/Body
Motivacin
La herencia permite que una abstraccin tenga varias implementaciones: esta relacin se define en tiempo de compilacin Hay casos en los que puede haber una gran jerarqua de clases de una abstraccin (p.ej. Window, IconWindow, TransientWindow) y varias jerarquas de implementacin (en diferentes plataformas)
Es necesario desacoplar la abstraccin de la implementacin
Patrones de creacin
62
Bridge
Patrones de creacin
63
Bridge
Aplicacin
Para evitar una vinculacin permanente entre una abstraccin y su implementacin
Permite cambiar la implementacin en tiempo de ejecucin
Cuando tanto las abstracciones como las implementaciones podran ser susceptibles de extensin mediante subclases
El patrn Bridge permite combinar las abstracciones e implementaciones y extenderlas independientemente Permite adems reducir la proliferacin de clases (ver ejemplo de motivacin)
Para que cambios en la implementacin de una abstraccin no hagan recompilar el cdigo de los clientes
En C++ es ms crtico porque la representacin de una clase es visible en su definicin
Para compartir una implementacin entre mltiples objetos, sin que lo noten los clientes
Patrones de creacin
64
Bridge
Esquema, participantes y colaboraciones
La Abstraccin pasa las peticiones del cliente al objeto Implementor
Define la interfaz de las clases de implementacin, que no se tiene que corresponder con la de Abstraction
Patrones de creacin
65
Bridge
Consecuencias
Se desacopla interfaz e implementacin
La implementacin no est vinculada permanentemente a la interfaz, y se puede determinar en tiempo de ejecucin (incluso cambiar) Se eliminan dependencias de compilacin Se consigue una arquitectura ms estructurada en niveles
Se mejora la extensibilidad
Las jerarquas de abstraccin y de implementacin pueden evolucionar independientemente
Patrones de creacin
66
Bridge
Implementacin y patrones relacionados
Una sola clase de implementacin
En este caso no es necesario salvo casos donde no se quiere tener que recompilar el cliente ante cambios de la implementacin (en C++ slo habra que volver a linkar)
Compartir objetos de implementacin El patrn Adaptador tiene tambin el objetivo de hacer trabajar juntas clases con distinta interfaz, pero en general se aplica a sistemas que ya existen. El patrn Bridge suele aplicarse al empezar un diseo, para permitir que las abstracciones e implementaciones evolucionen independientemente
Patrones de creacin
67
Proxy
Propsito:
Es un sustituto de otro objeto, para controlar el acceso a l
Otras denominaciones:
Surrogate Virtual proxy
Motivacin
Puede haber ocasiones en que se desee posponer el coste de la creacin de un objeto hasta que sea necesario usarlo
Al abrir un documento, postergar el crear una imagen hasta que se tenga que visualizar En programas de comunicaciones, para un objeto remoto
El objeto proxy acta en lugar del verdadero objeto, y ofrece las misma interfaz, y las solicita en el objeto cuando es necesario
Por ejemplo cuando el editor del documento invoca la operacin Draw en la imagen para visualizarla
Juan Pavn Mestras Facultad de Informtica UCM, 2004 Patrones de creacin
68
Proxy
Patrones de creacin
69
Proxy
Aplicacin: cuando es necesario una referencia a un objeto ms sofisticada que el simple puntero o referencia a objeto
Proxy remoto, cuando el objeto est en otro espacio de memoria (proceso)
Stubs en RPC y CORBA
Proxy virtual, para postergar la creacin de objetos caros hasta el momento en que se necesitan
Imgenes en documentos
Referencias inteligentes, remplazan a una referencia o puntero para realizar alguna accin adicional:
Contar el nmero de referencias a un objeto para liberarlo cuando nadie lo usa Cargar un objeto persistente en memoria cuando se referencia por primera vez Sincronizar el acceso a un objeto con un cerrojo
Juan Pavn Mestras Facultad de Informtica UCM, 2004 Patrones de creacin
70
Proxy
Esquema, participantes y colaboraciones
El Proxy pasa las peticiones al RealSubject cuando sea apropiado, dependiendo del tipo de proxy
Define el objeto real que representa el proxy Mantiene una referencia al sujeto real y proporciona la misma interfaz Controla el acceso al sujeto real y puede ser responsable de crearlo y destruirlo
Juan Pavn Mestras Facultad de Informtica UCM, 2004 Patrones de creacin
71
Proxy
Consecuencias
Introduce un nivel de indireccin al acceder a un objeto
Este nivel de indireccin tiene usos distintos dependiendo del tipo de proxy: Un proxy remoto puede ocultar dnde est el objeto real Un proxy virtual puede mejorar la eficiencia por ejemplo al crear un objeto bajo demanda Tanto los proxies de proteccin como las referencias inteligentes realizan tareas de gestin interna cuando se accede al objeto
Patrones de creacin
72
Proxy
Implementacin y patrones relacionados
Un Proxy no tiene que conocer el tipo de un sujeto real
Puede acceder a l a travs de la interfaz abstracta
Patrones de creacin
73
Proxy
Implementacin y patrones relacionados
El Adaptador proporciona una interfaz diferente al objeto que adapta, pero el proxy tiene la misma interfaz
Aunque el proxy puede rehusar realizar una operacin (as su interfaz puede verse como un subconjunto)
El Decorador se puede implementar de manera similar al Proxy pero el propsito es diferente: el decorador aade responsabilidades a un objeto, el proxy slo controla su acceso
Patrones de creacin
74
Composite
Propsito:
Construir objetos complejos mediante la composicin recursiva de objetos similares de manera similar a un rbol
Motivacin
Las aplicaciones grficas tienen componentes que pueden agruparse para formar componentes mayores (contenedores)
Patrones de creacin
75
Composite
Patrones de creacin
76
Composite
Aplicacin
Para representar jerarquas de objetos parte-todo Para que los clientes puedan manejar indistintamente objetos individuales o composiciones de objetos
Los clientes tratan todos los objetos en la estructura composite de manera uniforme
Patrones de creacin
77
Composite
Esquema, participantes y colaboraciones
Los clientes usan la clase Componente para interaccionar con los objetos de la estructura composite. Si el recipiente es una Hoja la peticin se maneja directamente. Si se trata de un Composite, se pasa a sus componentes hijos, pudindose realizar operaciones adicionales antes o despus
Interfaz de los objetos de la composicin Implementa el comportamiento por defecto Guarda sus hijos Implementa operaciones sobre los hijos de la interfaz Component
Patrones de creacin
78
Composite
Consecuencias
Define jerarquas de clases que tienen objetos primitivos y objetos compuestos (composite)
La composicin puede ser recursiva
Facilita la adicin de nuevas clases de componentes Puede hacer que el diseo sea demasiado general
Hace ms difcil restringir los componentes de un composite Si se quiere hacer que un composite slo tenga ciertos componentes hay que codificar las comprobaciones para que se realicen en tiempo de ejecucin
Patrones de creacin
79
Composite
Implementacin y patrones relacionados
Referencias explcitas al padre Comparticin de componentes Maximizar la interfaz Component Operaciones de gestin de hijos Debe implementar Component una lista de Components? Orden de los hijos Mejora de la eficiencia con caching Quin debe eliminar los componentes? Cul es la mejor estructura de datos para almacenar los componentes? Los Iteradores se pueden usar para recorrer composites El Visitor localiza operaciones y comportamiento que de otra manera se distribuira entre las hojas y el composite
Patrones de creacin
80
Decorador
Propsito:
Asignar nuevas responsabilidades a un objeto dinmicamente. Es una alternativa a la creacin de subclases por herencia
Otras denominaciones:
Decorator Wrapper
Motivacin
Para aadir nuevas responsabilidades a objetos individuales y no a toda la clase
Por ejemplo, una ventana de una interfaz grfica puede tener bordes, scrolling, u otros artifactos
Patrones de creacin
81
Decorador
Patrones de creacin
82
Decorador
Aplicacin
Para asignar responsabilidades a objetos individuales de forma dinmica y transparente, sin afectar a otros objetos Para responsabilidades que pueden ser suprimidas Cuando no es prctico utilizar herencia de clases (porque se producira una explosin del nmero de clases, o porque no se tiene la definicin de la clase)
Patrones de creacin
83
Decorador
Esquema, participantes y colaboraciones
El Decorador enva las peticiones a su objeto Componente, y puede realizar alguna operacin adicional antes o despus
Define la interfaz de los objetos a los que se les pueden asignar nuevas responsabilidades
Patrones de creacin
84
Decorador
Consecuencias
Ms flexibilidad que la herencia de clases (esttica)
Las responsabilidades se aaden y quitan dinmicamente (en tiempo de ejecucin) Evita la explosin de clases Permiten aadir una propiedad ms de una vez
Por ejemplo, aadir doble borde a una ventana
Se puede definir una clase sencilla y aadirle nuevas caractersticas mediante decoradores, pudiendo as obtener gran funcionalidad combinando piezas sencillas
Slo se incorpora lo que se usa
Patrones de creacin
85
Decorador
Implementacin y patrones relacionados
Conformidad de interfaces
La interfaz de un objeto decorador debe ser conforme con la del componente que decora, por tanto un objeto decorador concreto debe heredar de una clase comn Si slo se va a definir una nueva responsabilidad no hace falta definir la clase abstracta Decorador La definicin de los datos internos de la clase se debe dejar a las implementaciones
Decorador vs. Strategy: el Decorador puede actuar antes o despus de llamar a los mtodos de otro objeto, para cambiar lo que se hace en medio de la llamada a un mtodo se usa el patrn Strategy Es distinto del Adaptador ya que slo aade responsabilidades a un objeto, no su interfaz Puede verse como un caso degenerado de Composite con un solo componente. Sin embargo, el decorador aade responsabilidades
Juan Pavn Mestras Facultad de Informtica UCM, 2004 Patrones de creacin
86
Fachada
Propsito:
Simplifica el acceso a un conjunto de objetos proporcionando uno que todos los clientes pueden usar para comunicarse con el conjunto
Otras denominaciones:
Faade
Motivacin
Minimizar las comunicaciones y dependencias entre subsistemas
Patrones de creacin
87
Fachada
El subsistema de compilacin ofrece scanner, parser, ... a travs de una interfaz unificada (la fachada) de la funcionalidad del compilador, sin ocultar completamente las clases que lo implementan
Patrones de creacin
88
Fachada
Aplicacin
Para proporcionar una interfaz sencilla a un subsistema complejo
A medida que un subsistema evoluciona va teniendo ms clases, ms pequeas, ms flexibles y configurables Hay clientes que no necesitan tanta flexibilidad y que quieren una visin ms simple del subsistema Slo los clientes que necesiten detalles de ms bajo nivel accedern a las clases detrs de la fachada
Cuando hay muchas dependencias entre los clientes y las clases de implementacin de una abstraccin
La fachada desacopla el subsistema de los clientes y de otros subsistemas Esto mejora la independencia de subsistemas y la portabilidad
89
Fachada
Esquema, participantes y colaboraciones
Los clientes se comunican con el subsistema haciendo peticiones a la Fachada, que las enva a los objetos del subsistema apropiados (la fachada podra tambin traducir su interfaz a la de las interfaces del subsistema) Los clientes que usan la fachada no tienen que acceder a los objetos del subsistema directamente
Conoce los objetos del subsistema responsables para cada peticin, y delega en ellos las peticiones de los clientes
Patrones de creacin
90
Fachada
Consecuencias
Oculta a los clientes los componentes del subsistema
Reduce el nmero de objetos con los que tienen que tratar los clientes
No evita que las aplicaciones puedan usar las clases del subsistema si lo necesitan
Se puede elegir entre facilidad de uso y generalidad
Patrones de creacin
91
Fachada
Implementacin y patrones relacionados
Reduccin del acoplamiento cliente-subsistema
Se puede reducir ms el acoplamiento haciendo la fachada una clase abstracta con subclases concretas para las distintas implementaciones del subsistema. Los clientes se comunican con el subsistema usando la interfaz de la clase fachada abstracta Otra posibilidad es configurar el objeto fachada con diferentes objetos del subsistema. Para personalizar la fachada basta con reemplazar uno o varios de sus objetos del subsistema La factora abstracta se puede utilizar junto a la fachada para crear objetos del subsistema de manera independiente al subsistema
Normalmente slo hace falta un objeto Fachada, por lo cual suele implementarse como Singleton
Patrones de creacin
92
Discusin
Muchos patrones estructurales tienen bastante similitud en el esquema, los participantes y las colaboraciones Las diferencias estn principalmente en el propsito
Adaptador y Bridge
Ambos envan peticiones a un objeto cuya interfaz es distinta El adaptador trata de resolver incompatibilidades entre interfaces existentes, bridge trata de proporcionar una interfaz estable a los clientes, independiente de cmo evolucione la implementacin Por tanto el Adaptador suele aparecer cuando ya hay clases desarrolladas, pero el Bridge es algo que el diseador avanza al principio del ciclo de vida del sistema
Patrones de creacin
93
Discusin
Las diferencias estn principalmente en el propsito
Composite y Decorator
Ambos se basan en la composicin recursiva para organizar un conjunto de objetos ilimitado El Decorador pretende facilitar el aadir responsabilidades a los objetos sin hacer subclases. Composite trata de que mltiples objetos se puedan tratar de manera uniforme, como uno (el nfasis est en la representacin y no en el embellecimiento) Los propsitos son complementarios y por tanto se suelen usar los dos patrones conjuntamente
Proxy
Similar estructura que Decorator Especializacin de Bridge
Patrones de creacin
94
Patrones de comportamiento
Patrones de comportamiento
Algoritmos y asignacin de responsabilidades entre objetos y patrones de comunicacin entre objetos Distribucin del comportamiento entre varias clases
Mediante herencia
Mtodo Template: definicin abstracta de un algoritmo Intrprete: representa una gramtica como una jerarqua de clases
Encapsulado de comportamientos
Estrategia: encapsula un algoritmo en un objeto Comando: encapsula una peticin a un objeto Estado: encapsula el estado de un objeto Visitor: encapsula un comportamiento Iterador: el mtodo de recorrer una coleccin de clases
Patrones de creacin
96
Patrones de comportamiento
Chain of responsability
Peticin delegada al proveedor de servicio responsable
Command
Encapsula una peticin como un objeto
Interpreter
Intrprete de lenguaje para una gramtica sencilla
Iterator
Para acceder secuencialmente a elementos de una agregacin
Mediator
El mediador coordina las interacciones entre sus asociados
Memento
Captura el estado de un objeto y lo restaura posteriormente
Patrones de creacin
97
Patrones de comportamiento
Observer
Para notificar automticamente cambios de estado de un objeto a todos los dependientes
State
Objeto cuyo comportamiento depende de un estado (el objeto puede aparentar cambiar de clase segn un estado)
Strategy
Abstraccin para seleccionar uno o varios algoritmos
Template method
Algoritmo con varios pasos suministrados por una clase derivada
Visitor
Operaciones aplicadas a elementos de una estructura de objetos heterognea
Patrones de creacin
98
Mtodo Template
Propsito:
Permite construir el esqueleto de un algoritmo dejando los detalles a las subclases
Aplicacin
Permite escribir las partes fijas de un algoritmo una sola vez y definir las partes que varan en las subclases Refactorizacin de cdigo
Identificar las diferencias en el cdigo existente Separar las diferencias en nuevas operaciones Reemplazar el cdigo diferente con un mtodo template que llama a esas operaciones nuevas
Patrones de creacin
99
Mtodo Template
Esquema, participantes y colaboraciones
La clase abstracta define las operaciones primitivas (pasos del algoritmo) que deben implementar las subclases concretas El mtodo template define el esqueleto del algoritmo
Patrones de creacin
100
Mtodo Template
Consecuencias
Ayuda a la reutilizacin de cdigo
Por ejemplo, factorizando comportamiento en bibliotecas de clases
Patrones de creacin
101
Estrategia
Propsito:
Permite definir una familia de algoritmos, encapsulndolos de manera que se pueda intercambiar uno por otro
Otras denominaciones:
Policy (polticas)
Motivacin
En un procesador de textos, una clase Composition se encarga de gestionar la divisin de lneas de un texto y para ello delega en Compositor el algoritmo de divisin (por lneas, por prrafos, o por un nmero fijo de caracteres)
Patrones de creacin
102
Estrategia
Aplicacin
Cuando hay muchas clases similares que slo difieren en algn comportamiento
Se puede configurar una clase con varios comportamientos
Se necesitan variantes de un algoritmo Para ocultar estructuras de datos complejas que usa el algoritmo En vez de utilizar muchas instrucciones condicionales poner los comportamientos alternativos en clases estrategia concretas
Patrones de creacin
103
Estrategia
Esquema, participantes y colaboraciones
La estrategia y el contexto colaboran para implementar un algoritmo concreto:
La clase Strategy declara la interfaz comn a todos los algoritmos El contexto se configura con una estrategia concreta y mantiene la referencia correspondiente El contexto puede definir una interfaz para que la clase estrategia acceda a sus datos (y le pasar a la estrategia su referencia) o bien le pasa todos los datos necesarios en las operaciones
Patrones de creacin
104
Estrategia
Consecuencias
Permite gestionar familias de algoritmos
Se puede definir una jerarqua de clases de algoritmos
Sacar factor comn del cdigo Se comprende mejor la relacin entre los algoritmos de la familia
Elimina instrucciones condicionales Permite definir varias implementaciones del mismo comportamiento Como inconveniente, los clientes tienen que conocer las distintas estrategias para elegir la ms apropiada
Patrones de creacin
105
Discusin
Template Method vs. Strategy
El patrn mtodo template utiliza herencia para variar parte de un algoritmo El patrn estrategia utiliza delegacin para variar todo el algoritmo
Patrones de creacin
106
Bibliografa
Gamma E., Helm R., Johnson R., Vlissides J., ; Design Patterns. Elements of Reusable Object-Oriented Software; AddisonWesley, 1995. Traduccin al castellano (2002): Diseo de patrones. Pearson Educacin James W. Cooper, The Design Patterns Java Companion. Addison Wesley, 1998 Steven J. Metsker, Design Patterns Java Workbook, Addison Wesley, 2002
Patrones de creacin
107