1 / 64

Patrones de Diseño

Patrones de Diseño. Daniel Mazzini dmazzini@ubicasolutions.com Ubica Solutions. Conocimientos previos. Conocimientos de POO. UML (básico) C#. Agenda. Propósito de los patrones Fundamentos de diseño. Creación. Factory Method Singleton Abstract Factory. Estructurales Adapter Facade

jaden
Télécharger la présentation

Patrones de Diseño

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Patrones de Diseño Daniel Mazzini dmazzini@ubicasolutions.com 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 • 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. 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: • 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 ParisDakar GP de Catalunya +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado Ruedas CrearRueda() { return new Rueda26(); } Ruedas CrearRueda() { return new RuedaMoto(); } 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. Cliente A B C Cliente Facade A B C F.M A.M A.M B.M B.M C.M C.M Facade 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. Externa ClaseA ClaseB ExternoAdaptado +DiferenteNombre() +Operacion() +Operacion() +ExternoAdaptado(Externa) +Operacion() _externa.DiferenteNombre() Adapter Cliente IOperacion +Operacion() 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. Almacén -Productos():ArrayList +Seleccionar(Especificacion):ArrayList TamañoEsp CompuestoAndEsp ColorEsp +TamañoEsp(TamañoTipo) +CompuestoEsp(Espec, Espec) +ColorEsp(ColorTipo) +EstaOK(Producto):bool +EstaOK(Producto):bool +EstaOK(Producto):bool Composite Espec Rojos = new ColorEsp(Color.Red); ArrayList prodRojos =alm.Seleccionar(Rojos); 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 return (_espec1.EstaOK(Producto) && _espec2.EstaOK(Producto)); Daniel Mazzini

  48. Almacén -Productos():ArrayList Especificación +Seleccionar(Especificacion):ArrayList +EstaOK(Producto):bool CompuestoEsp #CompuestoEsp(Espec[]) CompOrEsp CompAndEsp +CompAndEsp(Espec[]) +CompOrEsp(Espec[]) +EstaOK(Producto):bool +EstaOK(Producto):bool Composite 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); Lista ColorEsp TamañoEsp Daniel Mazzini

  49. DEMO Composite Daniel Mazzini

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

More Related