Escolar Documentos
Profissional Documentos
Cultura Documentos
Conocimientos previos
Daniel Mazzini
Agenda
Estructurales
Adapter Facade Composite
Comportamiento
Daniel Mazzini
Qu es un patrn de diseo?
Ante un problema reiterado ofrece una solucin contrastada que lo resuelve. Describe el problema en forma sencilla. Describe el contexto en que ocurre. Describe los pasos a seguir. Describe los puntos fuertes y dbiles de la solucin. Describe otros patrones asociados.
Daniel Mazzini
Por qu usarlos?
Hay que hacer un Factory Method Facilita la documentacin interna del proyecto. Eleva el nivel del grupo de desarrollo. Son soluciones ya probadas. Cuan grande debe ser una clase?
Daniel Mazzini
Categorizacin
Fundamentales
Se usan en otros patrones mas grandes Aislar el proceso de creacin de un objeto. Desacopla el sistema. Describe situaciones de control de flujo.
Daniel Mazzini
Creacin
Estructura
Comportamiento
Problema - Patrn
Daniel Mazzini
Problema
Patrn (cont)
Daniel Mazzini
Problema
Patrn (cont)
Alto acoplamiento
Daniel Mazzini
Fundamentos de diseo
Programar para las interfaz, no para la herencia. Favorecer la composicin antes que la herencia. Delegacin. Doble Herencia.
Daniel Mazzini
Herencia o interfaz
La herencia de clase define la implementacin de una clase a partir de otra (excepto mtodos abstractos) La herencia de interfaz define como se llamara el mtodo o propiedad, pudiendo escribir distinto cdigo en cada clase.
Daniel Mazzini
Reduccin de dependencias. El cliente desconoce la implementacin. La vinculacin se realiza en tiempo de ejecucin. Da consistencia (contrato). Indireccionamiento.
Daniel Mazzini
Desventaja:
Favorecer la composicin
Ventajas de la herencia:
Implementacin ya realizada. til en situaciones es un Construir un monstruo. No se puede cambiar la implementacin heredada en tiempo de ejecucin. Quebrar la encapsulacin. Visibilidad.
Daniel Mazzini
Ventajas de la composicin:
Crear una nueva clase ensamblando con mas de una clase. Puede cambiar la clase con la cual ensamblo en tiempo de ejecucin. Centrar cada clase en una tarea. Requiere escribir un poco mas de cdigo. Indireccionamiento.
Desventaja de la composicin:
Daniel Mazzini
Delegacin
Una forma de componer. Se delega un conjunto de operaciones de un objeto en otro objeto. La herencia que use en VB6.
return Delegado.operacion()
Daniel Mazzini
AntiAnti-Ejemplo
Nuevo requerimiento: No todos las ventanas son cuadradas
Daniel Mazzini
Ejemplo de Delegado
Quito la herencia en ventana Creo una interfaz para comunicar el delegador con el delegado Creo un mtodo llamado Area en Ventana (solo para mantener compatibilidad) Llamo al mtodo de la interfaz que me da el rea
Daniel Mazzini
Daniel Mazzini
Delegado en .Net
Daniel Mazzini
Doble Herencia
Problema:
Mantener las clases que implementan como internas del proyecto (internal o Friend), pero la interfaz pblica. Organizar clases que tienen un comportamiento parecido para que sea consistente.
Daniel Mazzini
Clase base es abstracta. La clase base puede heredar de mas de una interfaz. Una vez que estn escritos los mtodos, verifico si hay duplicacin en las clases hijas.
Daniel Mazzini
Daniel Mazzini
Patrones de creacin
Propsito:
Crear un objeto es una toma de decisin. Separar los procesos de creacin de objeto y de uso de un objeto. Factory Method Singleton Abstract Factory
Cuales veremos?
Daniel Mazzini
Factory Method
Problema:
La instancia del objeto a crear depende de condiciones externas a la clase cliente. Puede cambiar independientemente de cambiar la clase cliente. Ya he creado la estructura con Doble Herencia , pero ahora necesito poder crear una instancia de cualquier clase concreta.
Daniel Mazzini
Factory Method
Daniel Mazzini
Daniel Mazzini
Mtodo esttico en clase abstracta que retorno instancias. Constructores privados o protegidos.
Daniel Mazzini
Daniel Mazzini
Singleton
Problema:
No se puede tener mas de una instancia de una clase. Se necesita controlar el acceso a una clase.
Daniel Mazzini
Singleton
Cambio el constructor a privado. Hago que la clase no pueda ser heredada. Agrego una variable esttica del mismo tipo de la clase donde esta contenida. (instancia) Agrego un mtodo esttico que retorne la variable esttica. (GetInstance) No creo el objeto hasta que sea necesario (Lazy Creation) Agrego el cdigo necesario para no crear dos instancias en distintos thread. Daniel Mazzini
Daniel Mazzini
Abstract Factory
Problema
Necesito crear una familia de objetos. Trabajo con mas de una familia. No puedo combinar tems de las familias de objetos. El resto del sistema debe trabaja sin distinguir entre familias de objetos.
Daniel Mazzini
Abstract Factory
Daniel Mazzini
Carrera
+CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado TourDeFrancia Ruedas CrearRueda() {
return new Rueda26(); } Ruedas CrearRueda() { return new RuedaMoto(); }
ParisDakar
+CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado
GP de Catalunya
+CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado
Daniel Mazzini
Daniel Mazzini
Patrones de estructura
Propsito:
Desacoplar el sistema. Obtener una estructura flexible. Organizar. Adapter Facade Composite
Cuales veremos?
Daniel Mazzini
Facade
Problemas:
El cliente hace muchos viajes al servidor. Separe por capas, pero tengo muchas clases pblicas en el servidor para que puedan ser creadas desde el cliente. Necesito estructurar las llamadas desde el cliente.
Daniel Mazzini
Facade
Form Cliente Form Pedidos
Cliente
Presentacin
Lgica
Daniel Mazzini
Facade
Cliente A B C Cliente Facade A B C F.M A.M A.M
B.M
B.M
C.M
C.M
Daniel Mazzini
Facade
Un caso de uso es lo interaccin de un actor con el sistema. La mtodos de la fachada encapsulan los pasos necesarios para llevar a cabo lo que el cliente desea hacer.
Daniel Mazzini
Daniel Mazzini
Adapter
Problemas:
Necesitamos llamar a un mtodo a travs de una interfaz para no tener dependencia en el cliente. La librera a la que hay que llamar no es nuestra y no implementa esa interfaz. No contamos con el cdigo fuente de la librera.
Daniel Mazzini
Adapter
Cliente IOperacion
+Operacion()
ExternoAdaptado
+ExternoAdaptado(Externa) +Operacion()
ClaseA
+Operacion()
ClaseB
+Operacion()
_externa.DiferenteNombre()
Externa
+DiferenteNombre()
Daniel Mazzini
Daniel Mazzini
Composite
Problema:
Estructuras de rbol o estructuras 1-N. 1Tiene un objeto complejo que hay que descomponer en partes. Nodos especiales que pueden contener otros nodos.
Daniel Mazzini
Composite
Almacn
-Productos():ArrayList +Seleccionar(Especificacion):ArrayList
+EstaOK(Producto):bool
Especificacin
ColorEsp
+ColorEsp(ColorTipo) +EstaOK(Producto):bool
TamaoEsp
+TamaoEsp(TamaoTipo) +EstaOK(Producto):bool
CompuestoAndEsp
+CompuestoEsp(Espec, Espec) +EstaOK(Producto):bool
Composite
Espec[] ar = new Espec[] { new ColorEsp(Color.Red), -Productos():ArrayList new TamaoEsp(Tamao.Pequeo)}; +Seleccionar(Especificacion):ArrayList Espec ExpresionOr = new CompOrEsp(ar); ArrayList prodRojos =alm.Seleccionar(ExpresionOr);
Almacn
Especificacin
+EstaOK(Producto):bool
Lista
ColorEsp
TamaoEsp
CompuestoEsp
#CompuestoEsp(Espec[])
CompAndEsp
+CompAndEsp(Espec[]) +EstaOK(Producto):bool
CompOrEsp
+CompOrEsp(Espec[]) +EstaOK(Producto):bool
Daniel Mazzini
Daniel Mazzini
Composite Dinmico
Empleado
+Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double
NodosHojas
+Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double
NodosPadre
+Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double
Empleados
-EsHoja() -Empleados:Arraylist
Empleado
Empleados
Daniel Mazzini
Patrones de Comportamiento
Propsito:
Asignacin de responsabilidad = Distribuir el comportamiento. Comunicacin entre instancias. Se usa mas la composicin que la herencia. Command Strategy State
Daniel Mazzini
Cuales veremos?
Command
Problema:
Operaciones repetidas (por ejemplo, en el men y en el toolbar). Necesita controlar la secuencia de las operaciones. Necesito hacer un log de las operaciones que ejecuta el cliente.
Daniel Mazzini
Command
Cliente
+Hacer()
ICommand
Comando1
+Commando1(Estado) +Hacer()
Comando2
+Comando2(Ejecutar) +Hacer()
Daniel Mazzini
Command
Tambien puedo:
Crear un mtodo Deshacer en la Interfaz. Puedo crear una pila de los ltimos comandos que se ejecutaran. Puedo sacar de la pila de comandos ejecutados y llamar al mtodo Deshacer. Juntndolo con el patrn Composite puedo generar un comando Macro.
Daniel Mazzini
Command
Cliente Command Manager
+Undo(int Cantidad) +Redo(int Cantidad) +CrearComando(estado)
+Hacer() +DesHacer()
ICommand
lista
Comando1
Comando2
ComandoMacro
+Comando2(Estado) +Hacer() +Deshacer()
Daniel Mazzini
State
Problema:
Mantener el estado de un objeto. La organizacin de la lgica que maneja el estado (maquina de estado) se torna incontrolable. Acoplamiento entre la funcionalidad propia de la clase y la funcionalidad para manejar el estado de un objeto.
Daniel Mazzini
State
Boya
-EstadoActual:Estado +CambiarEstado()
Estado
Estado
+CambiarEstado()
Estado
+CambiarEstado()
Daniel Mazzini
Observer
Problema:
Mantener distintos objetos relacionados, generalmente son relaciones 1 N. Mantener las dependencias entre objetos, sin necesidad de conocer al otro objeto.
Tipos de objetos:
Publicador : Aquel que tiene que notificar de un cambio. Suscriptores: Aquellos interesados en recibir la notificacin.
Daniel Mazzini
Observer
Publicador
+Agregar(Observador) +Quitar(Observador) +Notificar()
Observador
+Actualizar()
C.Control
+Actualizar()
Boya
+ObtenerEstado()
Daniel Mazzini
Otras consideraciones
Puedo enviar la informacin necesaria a los suscriptores al notificar o que pida lo que necesita (dependencia hacia el publicador) Ante casos de muchos publicadores, puedo hacer un Gestor de Cambios que haga la funcin de mediador. Al notificar se puede usar delegados y pasar clases que hereden de EventArgs al Suscriptor.
Daniel Mazzini
Daniel Mazzini
Conclusiones
Empiece por un patron, estudie los problemas que resuelve y pase cuando lo haya probado. Si la espada ya esta sobre su cabeza, lea los problemas que resuelven todos los patrones. No deje de leer:
Patrones de Diseo, E. Gamma y otros (GoF). Patterns of Enterprise Application Architecture, Martin Fowler
Daniel Mazzini