Você está na página 1de 64

Patrones de Diseo

Daniel Mazzini dmazzini@ubicasolutions.com Ubica Solutions

Conocimientos previos
  

Conocimientos de POO. UML (bsico) C#

Daniel Mazzini

Agenda
 

Propsito de los patrones Fundamentos de diseo.


Creacin.
Factory Method Singleton Abstract Factory Command State Observer
Daniel Mazzini

Estructurales
Adapter Facade Composite

Comportamiento

Propsito de los patrones


   

Qu es un patrn de diseo? Por qu usarlos? Categorizacin Problema - Patrn

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?


Mejora en la comunicacin y documentacin


 

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?

Mejora la ingeniera de software.




Previene reinventar la rueda en diseo




Mejora la calidad y estructura




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


Crear un objeto sin especificar la clase a la que pertenece


  

Abstract Factory Factory Method Prototype Command Cadena de Responsabilidad

Dependencia para tareas especificas


 

Daniel Mazzini

Problema

 

Patrn (cont)

Dependencia hacia el hardware o software


Abstract Factory Bridge Strategy Template Method Builder

Dependencia hacia los algoritmos


  

Daniel Mazzini

Problema


Patrn (cont)

Alto acoplamiento
  

Faade Mediator Observer

Imposibilidad de cambiar la clases convenientemente


  

Adapter Decorator Visitor

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

Programar para las interfaz




Reutilizar la implementacin de la clase base es la mitad de la historia. Ventajas:


  

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.

Desventajas de usar herencia:


 

 

Daniel Mazzini

Favorecer la composicin (cont)




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

Doble Herencia (cont)


 

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

Doble Herencia en .NET

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

F.M. con Constructor Esttico

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

+CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado

ParisDakar
+CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado

GP de Catalunya
+CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado

Ruedas CrearRueda() { return new RuedaF1(); }

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

Form Ctas Corrientes

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


Caso de Uso = 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

Espec Rojos = new ColorEsp(Color.Red);


ArrayList prodRojos =alm.Seleccionar(Rojos); Espec RojoPeq = Espec Peq = new TamaoEsp(Tamao.Pequeo); new CompuestoAndEsp( ArrayList prodPeq = alm.Seleccionar(Peq); new ColorEsp(Color.Red), new TamaoEsp(Tamao.Pequeo)); ArrayList prodRojos =alm.Seleccionar(RojoPeq);

+EstaOK(Producto):bool

Especificacin

ColorEsp
+ColorEsp(ColorTipo) +EstaOK(Producto):bool

TamaoEsp
+TamaoEsp(TamaoTipo) +EstaOK(Producto):bool

CompuestoAndEsp
+CompuestoEsp(Espec, Espec) +EstaOK(Producto):bool

return (_espec1.EstaOK(Producto) && _espec2.EstaOK(Producto));


Daniel Mazzini

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

+Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double


Daniel Mazzini

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(Estado) +Hacer() +Deshacer()

Comando1

+Comando2(Estado) +Hacer() +Deshacer()


Daniel Mazzini

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

foreach Observador item in al { Item.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

Você também pode gostar