La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Daniel Mazzini Ubica Solutions

Presentaciones similares


Presentación del tema: "Daniel Mazzini Ubica Solutions"— Transcripción de la presentación:

1 Daniel Mazzini dmazzini@ubicasolutions.com Ubica Solutions
Patrones de Diseño Daniel Mazzini Ubica Solutions

2 Conocimientos previos
Conocimientos de POO. UML (básico) C# Daniel Mazzini

3 Agenda Propósito de los patrones Fundamentos de diseño. Creación.
Factory Method Singleton Abstract Factory Estructurales Adapter Facade Composite Comportamiento Command State Observer Daniel Mazzini

4 Propósito de los patrones
¿Qué es un patrón de diseño? ¿Por qué usarlos? Categorización Problema - Patrón Daniel Mazzini

5 ¿Qué es un patrón de diseño?
Ante un problema reiterado ofrece una solución 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 débiles de la solución. Describe otros patrones asociados. Daniel Mazzini

6 ¿Por qué usarlos? Mejora en la comunicación y documentación
“Hay que hacer un Factory Method” Facilita la documentación interna del proyecto. Mejora la ingeniería de software. Eleva el nivel del grupo de desarrollo. Previene “reinventar la rueda” en diseño Son soluciones ya probadas. Mejora la calidad y estructura “¿Cuan grande debe ser una clase?” Daniel Mazzini

7 Categorización Fundamentales Creación Estructura Comportamiento
Se usan en otros patrones mas grandes Creación Aislar el proceso de creación de un objeto. Estructura Desacopla el sistema. Comportamiento Describe situaciones de control de flujo. Daniel Mazzini

8 Problema - Patrón Crear un objeto sin especificar la clase a la que pertenece Abstract Factory Factory Method Prototype Dependencia para tareas especificas Command Cadena de Responsabilidad Daniel Mazzini

9 Problema – Patrón (cont)
Dependencia hacia el hardware o software Abstract Factory Bridge Dependencia hacia los algoritmos Strategy Template Method Builder Daniel Mazzini

10 Problema – Patrón (cont)
Alto acoplamiento Façade Mediator Observer Imposibilidad de cambiar la clases convenientemente Adapter Decorator Visitor Daniel Mazzini

11 Fundamentos de diseño Programar para las interfaz, no para la herencia. Favorecer la composición antes que la herencia. Delegación. Doble Herencia. Daniel Mazzini

12 Herencia o interfaz La herencia de clase define la implementación de una clase a partir de otra (excepto métodos abstractos) La herencia de interfaz define como se llamara el método o propiedad, pudiendo escribir distinto código en cada clase. Daniel Mazzini

13 Programar para las interfaz
Reutilizar la implementación de la clase base es la mitad de la historia. Ventajas: Reducción de dependencias. El cliente desconoce la implementación. La vinculación se realiza en tiempo de ejecución. Da consistencia (contrato). Desventaja: Indireccionamiento. Daniel Mazzini

14 Favorecer la composición
Ventajas de la herencia: Implementación ya realizada. Útil en situaciones “es un” Desventajas de usar herencia: Construir un monstruo. No se puede cambiar la implementación heredada en tiempo de ejecución. Quebrar la encapsulación. Visibilidad. Daniel Mazzini

15 Favorecer la composición (cont)
Ventajas de la composición: Crear una nueva clase ensamblando con mas de una clase. Puede cambiar la clase con la cual ensamblo en tiempo de ejecución. Centrar cada clase en una tarea. Desventaja de la composición: Requiere escribir un poco mas de código. Indireccionamiento. Daniel Mazzini

16 return Delegado.operacion()
Delegación 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

17 Anti-Ejemplo Nuevo requerimiento: No todos las ventanas son cuadradas
Daniel Mazzini

18 Ejemplo de Delegado Quito la herencia en ventana
Creo una interfaz para comunicar el delegador con el delegado Creo un método llamado Area en Ventana (solo para mantener compatibilidad) Llamo al método de la interfaz que me da el área Daniel Mazzini

19 DEMO Delegado Daniel Mazzini

20 Delegado en .Net Daniel Mazzini

21 Doble Herencia Problema:
Mantener las clases que implementan como internas del proyecto (internal o Friend), pero la interfaz pública. Organizar clases que tienen un comportamiento parecido para que sea consistente. Daniel Mazzini

22 Doble Herencia (cont) Clase base es abstracta.
La clase base puede heredar de mas de una interfaz. Una vez que están escritos los métodos, verifico si hay duplicación en las clases hijas. Daniel Mazzini

23 Doble Herencia en .NET Daniel Mazzini

24 Patrones de creación Propósito: Cuales veremos?
Crear un objeto es una toma de decisión. Separar los procesos de creación de objeto y de uso de un objeto. Cuales veremos? Factory Method Singleton Abstract Factory Daniel Mazzini

25 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

26 Factory Method Daniel Mazzini

27 DEMO Factory Method Daniel Mazzini

28 F.M. con Constructor Estático
Método estático en clase abstracta que retorno instancias. Constructores privados o protegidos. Daniel Mazzini

29 DEMO Static Factory Daniel Mazzini

30 Singleton Problema: No se puede tener mas de una instancia de una clase. Se necesita controlar el acceso a una clase. Daniel Mazzini

31 Singleton Cambio el constructor a privado.
Hago que la clase no pueda ser heredada. Agrego una variable estática del mismo tipo de la clase donde esta contenida. (instancia) Agrego un método estático que retorne la variable estática. (GetInstance) No creo el objeto hasta que sea necesario (Lazy Creation) Agrego el código necesario para no crear dos instancias en distintos thread. Daniel Mazzini

32 DEMO Singleton Daniel Mazzini

33 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

34 Abstract Factory Daniel Mazzini

35 Carrera +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda
+CrearChasis():Chasis +CrearTrazado():Trazado TourDeFrancia +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado 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 Ruedas CrearRueda() { return new RuedaF1(); } Daniel Mazzini

36 DEMO Abstract Factory Daniel Mazzini

37 Patrones de estructura
Propósito: Desacoplar el sistema. Obtener una estructura flexible. Organizar. Cuales veremos? Adapter Facade Composite Daniel Mazzini

38 Facade Problemas: El cliente hace muchos viajes al servidor.
Separe por capas, pero tengo muchas clases públicas en el servidor para que puedan ser creadas desde el cliente. Necesito estructurar las llamadas desde el cliente. Daniel Mazzini

39 Facade Form Cliente Cliente Form Pedidos Form Ctas Corrientes
Presentación Lógica Daniel Mazzini

40 Facade Cliente A B C A.M B.M C.M Facade A B C Cliente F.M A.M B.M C.M
Daniel Mazzini

41 Facade Caso de Uso = Facade
Un caso de uso es lo interacción de un actor con el sistema. La métodos de la fachada encapsulan los pasos necesarios para llevar a cabo lo que el cliente desea hacer. Daniel Mazzini

42 DEMO Facade Daniel Mazzini

43 Adapter Problemas: Necesitamos llamar a un método a través de una interfaz para no tener dependencia en el cliente. La librería a la que hay que llamar no es nuestra y no implementa esa interfaz. No contamos con el código fuente de la librería. Daniel Mazzini

44 Adapter Cliente IOperacion ClaseA ClaseB ExternoAdaptado Externa
_externa.DiferenteNombre() Externa +DiferenteNombre() Daniel Mazzini

45 DEMO Adapter Daniel Mazzini

46 Composite Problema: Estructuras de árbol o estructuras 1-N.
Tiene un objeto complejo que hay que descomponer en partes. Nodos especiales que pueden contener otros nodos. Daniel Mazzini

47 Composite Almacén Especificación CompuestoAndEsp ColorEsp TamañoEsp
Espec Rojos = new ColorEsp(Color.Red); ArrayList prodRojos =alm.Seleccionar(Rojos); Almacén -Productos():ArrayList +Seleccionar(Especificacion):ArrayList Espec RojoPeq = new CompuestoAndEsp( new ColorEsp(Color.Red), new TamañoEsp(Tamaño.Pequeño)); ArrayList prodRojos =alm.Seleccionar(RojoPeq); Espec Peq = new TamañoEsp(Tamaño.Pequeño); ArrayList prodPeq = alm.Seleccionar(Peq); Especificación +EstaOK(Producto):bool CompuestoAndEsp +CompuestoEsp(Espec, Espec) +EstaOK(Producto):bool ColorEsp +ColorEsp(ColorTipo) +EstaOK(Producto):bool TamañoEsp +TamañoEsp(TamañoTipo) +EstaOK(Producto):bool return (_espec1.EstaOK(Producto) && _espec2.EstaOK(Producto)); Daniel Mazzini

48 Composite Almacén Especificación CompuestoEsp ColorEsp TamañoEsp
Espec[] ar = new Espec[] { new ColorEsp(Color.Red), new TamañoEsp(Tamaño.Pequeño)}; Espec ExpresionOr = new CompOrEsp(ar); ArrayList prodRojos =alm.Seleccionar(ExpresionOr); Almacén -Productos():ArrayList +Seleccionar(Especificacion):ArrayList Especificación +EstaOK(Producto):bool Lista CompuestoEsp #CompuestoEsp(Espec[]) ColorEsp TamañoEsp CompAndEsp +CompAndEsp(Espec[]) +EstaOK(Producto):bool CompOrEsp +CompOrEsp(Espec[]) +EstaOK(Producto):bool Daniel Mazzini

49 DEMO Composite Daniel Mazzini

50 Composite Dinámico Empleado Empleado NodosHojas NodosPadre Empleados
+Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double NodosHojas NodosPadre +Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double +Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double Empleados Empleado +Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double -EsHoja() -Empleados:Arraylist Empleados Daniel Mazzini

51 DEMO Composite Dinámico Daniel Mazzini

52 Patrones de Comportamiento
Propósito: Asignación de responsabilidad = Distribuir el comportamiento. Comunicación entre instancias. Se usa mas la composición que la herencia. Cuales veremos? Command Strategy State Daniel Mazzini

53 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

54 Command Cliente ICommand Comando1 Comando2 +Hacer() +Commando1(Estado)
+Comando2(Ejecutar) +Hacer() Daniel Mazzini

55 Command Tambien puedo: Crear un método 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 método Deshacer. Juntándolo con el patrón Composite puedo generar un comando Macro. Daniel Mazzini

56 Command Cliente Command Manager ICommand Comando1 Comando2
+Undo(int Cantidad) +Redo(int Cantidad) +CrearComando(estado) ICommand +Hacer() +DesHacer() Comando1 +Comando1(Estado) +Deshacer() Comando2 +Comando2(Estado) ComandoMacro lista Daniel Mazzini

57 DEMO Command Daniel Mazzini

58 State Problema: Mantener el estado de un objeto.
La organización de la lógica 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

59 State Boya Estado Estado Estado -EstadoActual:Estado +CambiarEstado()
Daniel Mazzini

60 Observer Problema: Tipos de objetos:
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 notificación. Daniel Mazzini

61 Observer Publicador Observador C.Control Boya
+Actualizar() +Agregar(Observador) +Quitar(Observador) +Notificar() foreach Observador item in al { Item.Actualizar() } C.Control +Actualizar() Boya +ObtenerEstado() Daniel Mazzini

62 Otras consideraciones
Puedo enviar la información 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 función de mediador. Al notificar se puede usar delegados y pasar clases que hereden de EventArgs al Suscriptor. Daniel Mazzini

63 DEMO Observer y State Daniel Mazzini

64 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 Diseño, E. Gamma y otros (GoF). Patterns of Enterprise Application Architecture, Martin Fowler Daniel Mazzini


Descargar ppt "Daniel Mazzini Ubica Solutions"

Presentaciones similares


Anuncios Google