Patrones de dise o
Download
1 / 64

Patrones de Diseño - PowerPoint PPT Presentation


  • 286 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Patrones de Diseño' - jaden


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


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


DEMO

Factory Method

Daniel Mazzini


F.M. con Constructor Estático

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

  • Constructores privados o protegidos.

Daniel Mazzini


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


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


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


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


    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


    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


    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


    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


    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


    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


    ad