Primer ejemplo
Caso prctico: el (tpico) videoclub
Se pretende disear el software referente a un videoclub. Este software debe contemplar las pelculas, los clientes y los alquileres que estos ltimos realizan. Existen dos tipos de pelculas, los estrenos y las regulares, y el coste del alquiler vara en funcin de dichos tipos.
Primer ejemplo
Diagrama de clases:
Cliente
1
Alquiler
-diasAlquilada
Pelcula
1
- titulo
+getCoste(diasAlquilada)
Comienza la implementacin
Realicemos el mtodo getCoste() de la clase Pelcula:
Sabemos que dependiendo de la categora de la pelcula (Estreno o Regular) se aplicarn tarifas distintas.
double getCoste(int diasAlquilada) { double result = 0; switch (getCategoria()) { case REGULAR: result += diasAlquilada*2; break; case ESTRENO: result += diasAlquilada*3; break; } return result; }
int [getDiasTopeAlquiler | getCostePenalizacinDia () | getDiasInhabilitacion | ]{ switch (getCategoria()) { case REGULAR: case ESTRENO: }
private int diasAlquilada; static final int 50PORCIENTO; static final int 75PORCIENTO;
int getDiasAlquiladaPromocion (int promocion) switch (promocion) { case 50PORCIENTO: switch (Pelicula.getCategoria()) case REGULAR: case ESTRENO: case 75PORCIENTO: } }
La lgica condicional
Efectivamente, lo anterior funcionara, pero sera mantenible? :
A los dos meses de estar operativa la aplicacin los requisitos, como no, cambian, ahora aparece la categora clsicos, maana de los 80 y al otro en cartelera
En nuestra micro aplicacin tenemos que tocar 5 mtodos y dos clases
Si nuestra aplicacin tuviese 80 clases, 12 constantes de estado y 20 switch repartidos por distintas clases
Javier Garzs, Introduccin a los patrones de diseo
Duplicacin de cdigo
- La lgica condicional casi siempre produce duplicacin de cdigo
Solucin?!
Javier Garzs, Introduccin a los patrones de diseo
PelculaRegular
PelculaEstreno
Todo resuelto?
Ms tarde observamos que una pelcula debe cambiar su categora en run-time:
Tendremos, por ejemplo:
Objeto_PeliculaEstreno Objeto_PeliculaRegular
Solucin: Podemos crear un nuevo objeto de la clase PeliculaEstreno, sacar el estado del objeto de PeliculaRegular, cargar todo en el objeto de Pelcula estreno, cambiar los apuntadores, matar el objeto de PeliculaRegular, tener cuidado de que ningn otro objeto le apuntase, etc.
De todas formas, el objeto no cambiara de clase, tendramos otro objeto de otra clase OID nico.
La solucin final
Solucin Final:
Pelicula
- titulo +getCoste(diasAlquilada)
Precio
+getCoste(diasAlquilada)
PrecioRegular
PrecioEstreno
Ventajas
Nuevos estados y sus transiciones se aaden fcilmente
Visin
Cuntas veces ha aparecido este problema?
Cuntas veces aparece cdigo errneo por qu el diseador no sabe o no tiene tiempo de pensar la solucin correcta?
Cmo aumentara la calidad? Se reducira el tiempo?
Javier Garzs, Introduccin a los patrones de diseo
Patrn State
Objetivo
Permite a un objeto alterar su comportamiento cuando su estado interno cambia.
Motivacin
Cuando un objeto cambia de estado puede responder de maneras diferentes a los mismos mensajes. La forma tradicional es poner sentencias condicionales.
Aplicabilidad
Un objeto cambia su comportamiento dependiendo de su estado y dicho comportamiento debe cambiar en run-time. Las operaciones que cambian se programan con mltiples sentencias condicionales que hacen difcil el mantenimiento.
State
Estructura
La visin formal
P. Coad, Object-Oriented Patterns, Comm. ACM, Vol. 35, No 9, Sep. 1992, pp. 152-159.
Javier Garzs, Introduccin a los patrones de diseo
F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad and M. Stal, A System of Patterns: Pattern-Oriented Software Architecture, AddisonWesley,1996.
Definicin de patrn
Una arquitectura reusable que la experiencia ha mostrado que resuelve un problema comn en un contexto especfico
Dictionary of Object Technology, 1995
Definicin de patrn
Cada patrn describe un problema que ocurre una y otra vez en nuestro entorno, describiendo el ncleo de la solucin a ese problema, de tal manera que esa solucin pueda ser usada ms de un milln de veces sin hacerlo dos veces de la misma forma
(Alexander, 1977).
Definicin de patrn
Un patrn contempla, adems de la solucin a un problema en un contexto:
Recurrencia Enseanza
Nombre
Consecuencias
Soluciones que slo han funcionado una vez Cualquier cosa vieja escrita en formato de patrones
Una cosa que los diseadores expertos no hacen es resolver cada problema desde el principio [...]. Cuando encuentran una buena solucin la usan una y otra vez. Esta experiencia es lo que les hace expertos
(Gamma ,1995)
El mercado
demanda rapidez y calidad
Disear bien a
la primera vez es imposible
Beneficios Potenciales
Mejora de la comunicacin, el ms potente.
Cmo podran varios arquitectos discutir el diseo de un edificio si slo conocen la palabra ladrillo? La semntica nos pierde.
Productividad y calidad, inmediatas cuando los equipos puedan sostener discusiones de diseo desde un alto nivel.
Patrones de Diseo
Idioms Patrones de Seguridad
Patrones de Diseo
Patrones de Diseo
El objetivo que se pretende es conocer el principal catlogo sobre patrones de diseo:
Design Patterns. Elements of Reusable Object-Oriented Software, by Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides
Ha sido reeditado 32 veces.
Patrones de Diseo
Patrones de Diseo
Describen una estructura a la cual muchas veces recurrimos para resolver problemas de diseo.
No afectan a la arquitectura de un sistema No dependen del lenguaje de implementacin.
Motivacin
- Un escenario que ilustra el problema y como la estructura del patrn lo soluciona. El escenario ayuda a comprender la descripcin mas abstracta que sigue
Estructura
- Una representacin grfica de las clases en el patrn
Participantes
- Descripcin de la responsabilidad de los objetos y clases participantes
Colaboraciones
- Diagramas de colaboracin entre los objetos y clases participantes
Javier Garzs, Introduccin a los patrones de diseo
Implementacin
- Qu tcnicas utilizar para implementar el patrn? - Hay caractersticas especficas del lenguaje?
Usos conocidos
- Ejemplos de uso del patrn en sistemas reales
Patrones relacionados
- Qu patrones estn fuertemente relacionados? - Cules son las diferencias importantes? - Con qu otros patrones se debera usar ste?
Dimensiones de organizacin
Por propsito
- Creacional - Estructura - Comportamiento
mbito
- Clase - Objeto
Factory Method
Define una interfaz para crear un objeto, dejando a las subclases decidir el tipo especfico. Permite delegar la responsabilidad de instanciacin a subclases
Singleton
Asegura una sola instancia de un objeto y provee un punto de acceso global a l
Builder
Separa la construccin de un objeto complejo de su representacin, para que el mismo proceso de construccin permita crear varias representaciones
Prototype
Especifica el tipo de objetos a crear usando una instancia de creacin (prototipo), y crea nuevas instancias copiando el prototipo
Javier Garzs, Introduccin a los patrones de diseo
EJERCICIO
Qu tipo de patrn utilizaras para creacin de la clase Videoclub?
Pelicula
- titulo +getCoste(diasAlquilada) +getCoste(diasAlquilada)
Precio
PrecioRegular
PrecioEstreno
Bridge
Desacopla una abstraccin de su implementacin y les permite variar independientemente
Composite
Compone objetos en jerarquas para representar relaciones parte-todo. Composite permite a los clientes tratar de la misma manera tanto a objetos individuales como a compuestos.
Decorator
Agrega dinmicamente nuevas responsabilidades a un objeto. Provee una alternativa muy flexible para agregar funcionalidad a una clase
Facade
Provee una interface nica para un conjunto de interfaces en un sistema. Define una interface de ms alto nivel que permite usar el sistema ms fcil
Proxy
Provee un representante de acceso a otro objeto
Ejemplo de Aplicacin
Problema?
Solucin: Composite
Solucin: Composite
Circulo
Linea
Grupo
Command
Encapsula una operacin en un objeto, permitiendo parametrizar operaciones, encolarlas, dejar log de ellas o deshacerlas
Interpreter
Dado un lenguaje, define una representacin de su gramtica que permita interpretar las sentencias del lenguaje
Iterator
Provee una forma de tener acceso secuencial a los elementos de un conjunto sin exponer la implementacin de ste ltimo
Javier Garzs, Introduccin a los patrones de diseo
Memento
Sin violar el encapsulamiento, captura y externaliza el estado interno de un objeto, para que pueda ser recuperado ms adelante
Observer
Define una dependencia de uno a muchos de tal manera que cuando uno de ellos cambia, todos los que dependen de l son notificados y actualizados automticamente
State
Permite a un objeto cambiar su comportamiento cuando su estado interno cambia. El objeto parecer haber cambiado de clase
Javier Garzs, Introduccin a los patrones de diseo
Template Method
Define un esqueleto de un algoritmo, delegando algunos pasos a las subclases. Permite redefinir ciertos pedazos del algoritmo sin cambiar su estructura
Visitor
Representa una operacin que debe realizarse sobre los elementos de una estructura de objetos. Permite definir nuevas operaciones sin cambiar las clases de los objetos sobre las cuales operan
Observer (1/5)
Objetivo
Define una dependencia de uno a muchos entre objetos, de manera que cuando un objeto cambia todos los que tienen dependencia de l son informados.
Motivacin
En casi todas las aplicaciones hay objetos que cundo cambian su valor deben de informar a otros objetos para que cambien su estado en ese momento.
Aplicabilidad
Cuando una abstraccin tiene diferentes aspectos y se desea reutilizar algunos de ellos de forma separada. Cuando un cambio en un objeto necesita realizar cambios en otros y no se sabe a priori en cuantos objetos se hace este cambio.Cuando un objeto debe notificar a otros de algn cambio y no se desea que se acoplen entre ellos.
Javier Garzs, Introduccin a los patrones de diseo
Observer (2/5)
Estructura
Observer (3/5)
Participantes
Subject: Conoce a sus observers, cualquier nmero de Observers puede observar a un Subject. Define un interfaz para admitir subscriptores. Observer: Define un interfaz para los objetos que deben ser notificados de los cambios en un Subject. ConcreteSubject: Guarda los estados de inters de un ConcreteObserver. Enva notificacin a sus observers cuando su estado cambia. ConcreteObserver: Mantiene una referencia a un ConcreteSubject. Implementa el interfaz Observer.
Observer (4/5)
Colaboraciones
Observer (5/5)
Consecuencias
Abstrae el acoplamiento entre Observer y Subject al definir un interfaz estndar para todos ellos. Soporta Broadcasting. Debido a que la interfaz es estndar puede provocar llamadas de actualizacin sobre Observers que no la necesitan.
Patrones relacionados
Mediator puede encapsular semnticas complejas de actualizacin. Singleton, al usar un Mediator puede ser importante que sea un Singleton.
CHAIN OF RESPONSIBILITY
Comportamiento
Interpreter Template Method Chain of Responsibility Command Iterator Mediator memento Observer State Strategy Visitor
Alcance
Clase
Factory Method
Ejemplo de Aplicacin
Cmo organizar el control de la aplicacin y, adems, agregar un mecanismo para la creacin de macros?
Command