Patrones de dise o
This presentation is the property of its rightful owner.
Sponsored Links
1 / 64

Patrones de Diseño PowerPoint PPT Presentation


  • 161 Views
  • Uploaded on
  • Presentation posted in: General

Patrones de Diseño. Daniel Mazzini [email protected] 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

Download Presentation

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Patrones de dise o

Patrones de Diseño

Daniel Mazzini

[email protected]

Ubica Solutions


Conocimientos previos

Conocimientos previos

  • Conocimientos de POO.

  • UML (básico)

  • C#

Daniel Mazzini


Agenda

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


Prop sito de los patrones

Propósito de los patrones

  • ¿Qué es un patrón de diseño?

  • ¿Por qué usarlos?

  • Categorización

  • Problema - Patrón

Daniel Mazzini


Qu es un patr n de dise o

¿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


Por qu usarlos

¿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


Categorizaci n

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


Problema patr n

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


Problema patr n cont

Problema – Patrón (cont)

  • Dependencia hacia el hardware o software

    • Abstract Factory

    • Bridge

  • Dependencia hacia los algoritmos

    • Strategy

    • Template Method

    • Builder

Daniel Mazzini


Problema patr n cont1

Problema – Patrón (cont)

  • Alto acoplamiento

    • Façade

    • Mediator

    • Observer

  • Imposibilidad de cambiar la clases convenientemente

    • Adapter

    • Decorator

    • Visitor

Daniel Mazzini


Fundamentos de dise o

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


Herencia o interfaz

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


Programar para las interfaz

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


Favorecer la composici n

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


Favorecer la composici n cont

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


Delegaci n

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


Anti ejemplo

Anti-Ejemplo

Nuevo requerimiento:

No todos las ventanas son cuadradas

Daniel Mazzini


Ejemplo de delegado

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


Patrones de dise o

DEMO

Delegado

Daniel Mazzini


Delegado en net

Delegado en .Net

Daniel Mazzini


Doble herencia

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


Doble herencia cont

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


Doble herencia en net

Doble Herencia en .NET

Daniel Mazzini


Patrones de creaci n

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


Factory method

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 method1

Factory Method

Daniel Mazzini


Patrones de dise o

DEMO

Factory Method

Daniel Mazzini


Patrones de dise o

F.M. con Constructor Estático

  • Método estático en clase abstracta que retorno instancias.

  • Constructores privados o protegidos.

Daniel Mazzini


Patrones de dise o

DEMO

Static Factory

Daniel Mazzini


Singleton

Singleton

  • Problema:

    • No se puede tener mas de una instancia de una clase.

    • Se necesita controlar el acceso a una clase.

Daniel Mazzini


Singleton1

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


Patrones de dise o

DEMO

Singleton

Daniel Mazzini


Abstract factory

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 factory1

Abstract Factory

Daniel Mazzini


Patrones de dise o

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


Patrones de dise o

DEMO

Abstract Factory

Daniel Mazzini


Patrones de estructura

Patrones de estructura

Propósito:

  • Desacoplar el sistema.

  • Obtener una estructura flexible.

  • Organizar.

  • Cuales veremos?

    • Adapter

    • Facade

    • Composite

  • Daniel Mazzini


    Facade

    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


    Facade1

    Facade

    Form Cliente

    Cliente

    Form Pedidos

    Form Ctas Corrientes

    Presentación

    Lógica

    Daniel Mazzini


    Facade2

    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


    Facade3

    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


    Patrones de dise o

    DEMO

    Facade

    Daniel Mazzini


    Adapter

    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


    Adapter1

    Externa

    ClaseA

    ClaseB

    ExternoAdaptado

    +DiferenteNombre()

    +Operacion()

    +Operacion()

    +ExternoAdaptado(Externa)

    +Operacion()

    _externa.DiferenteNombre()

    Adapter

    Cliente

    IOperacion

    +Operacion()

    Daniel Mazzini


    Patrones de dise o

    DEMO

    Adapter

    Daniel Mazzini


    Composite

    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


    Composite1

    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


    Composite2

    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


    Patrones de dise o

    DEMO

    Composite

    Daniel Mazzini


    Composite din mico

    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


    Patrones de dise o

    DEMO

    Composite Dinámico

    Daniel Mazzini


    Patrones de comportamiento

    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


    Command

    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


    Command1

    ICommand

    Cliente

    +Hacer()

    Comando1

    Comando2

    +Commando1(Estado)

    +Comando2(Ejecutar)

    +Hacer()

    +Hacer()

    Command

    Daniel Mazzini


    Command2

    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


    Command3

    Cliente

    ICommand

    +Hacer()

    +DesHacer()

    Comando2

    ComandoMacro

    Comando1

    +Comando2(Estado)

    +Comando2(Estado)

    +Comando1(Estado)

    +Hacer()

    +Deshacer()

    +Hacer()

    +Deshacer()

    +Hacer()

    +Deshacer()

    Command

    Command

    Manager

    +Undo(int Cantidad)

    +Redo(int Cantidad)

    +CrearComando(estado)

    lista

    Daniel Mazzini


    Patrones de dise o

    DEMO

    Command

    Daniel Mazzini


    State

    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


    State1

    Boya

    Estado

    Estado

    Estado

    -EstadoActual:Estado

    +CambiarEstado()

    +CambiarEstado()

    +CambiarEstado()

    State

    Daniel Mazzini


    Observer

    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 notificación.

    Daniel Mazzini


    Observer1

    Observador

    Boya

    C.Control

    +Actualizar()

    +ObtenerEstado()

    +Actualizar()

    Observer

    Publicador

    +Agregar(Observador)

    +Quitar(Observador)

    +Notificar()

    foreach Observador item in al

    {

    Item.Actualizar()

    }

    Daniel Mazzini


    Otras consideraciones

    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


    Patrones de dise o

    DEMO

    Observer y State

    Daniel Mazzini


    Conclusiones

    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


  • Login