Está en la 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.

Estructurales

Factory Method
Singleton
Abstract Factory

Adapter
Facade
Composite

Comportamiento
Command
State
Observer
Daniel Mazzini

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

Mejora la ingeniera de software.

Eleva el nivel del grupo de desarrollo.

Previene reinventar la rueda en diseo

Hay que hacer un Factory Method


Facilita la documentacin interna del proyecto.

Son soluciones ya probadas.

Mejora la calidad y estructura

Cuan grande debe ser una clase?


Daniel Mazzini

Categorizacin

Fundamentales

Creacin

Aislar el proceso de creacin de un


objeto.

Estructura

Se usan en otros patrones mas grandes

Desacopla el sistema.

Comportamiento

Describe situaciones de control de flujo.


Daniel Mazzini

Problema - Patrn

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

Dependencia hacia el hardware o


software

Abstract Factory
Bridge

Dependencia hacia los algoritmos

Strategy
Template Method
Builder

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

Desventaja:

Indireccionamiento.
Daniel Mazzini

Favorecer la composicin

Ventajas de la herencia:

Implementacin ya realizada.
til en situaciones es un

Desventajas de usar herencia:

Construir un monstruo.
No se puede cambiar la implementacin
heredada en tiempo de ejecucin.
Quebrar la encapsulacin.
Visibilidad.
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.

Desventaja de la composicin:

Requiere escribir un poco mas de


cdigo.
Indireccionamiento.
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

Anti-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.

Cuales veremos?

Factory Method
Singleton
Abstract Factory
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() {

+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

return new Rueda26();


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

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

Daniel Mazzini

Daniel Mazzini

Patrones de estructura
Propsito:

Desacoplar el sistema.
Obtener una estructura flexible.
Organizar.

Cuales veremos?

Adapter
Facade
Composite

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

Cliente

Facade

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
IOperacion

Cliente

+Operacion()

ExternoAdaptado

ClaseA

+ExternoAdaptado(Externa)
+Operacion()

+Operacion()

ClaseB

+Operacion()

_externa.DiferenteNombre()

Externa
+DiferenteNombre()
Daniel Mazzini

Daniel Mazzini

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

Composite
Almacn

Espec Rojos = new ColorEsp(Color.Red);

-Productos():ArrayList
+Seleccionar(Especificacion):ArrayList

ArrayList prodRojos =alm.Seleccionar(Rojos);


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

Especificacin

+EstaOK(Producto):bool

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
Almacn

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

Especificacin
+EstaOK(Producto):bool

Lista

ColorEsp

TamaoEsp

CompuestoEsp

#CompuestoEsp(Espec[])

CompAndEsp

+CompAndEsp(Espec[])
+EstaOK(Producto):bool

Daniel Mazzini

CompOrEsp

+CompOrEsp(Espec[])
+EstaOK(Producto):bool

Daniel Mazzini

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

NodosHojas

NodosPadre

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

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

Empleados

Empleado
-EsHoja()
-Empleados:Arraylist
+Agregar(Empleado)
+Quitar(Empleado)
+ObtenerSueldos():double

Daniel Mazzini

Empleados

Daniel Mazzini

Patrones de
Comportamiento

Propsito:

Asignacin de responsabilidad = Distribuir


el comportamiento.
Comunicacin entre instancias.
Se usa mas la composicin que la herencia.

Cuales veremos?

Command
Strategy
State
Daniel Mazzini

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

ICommand

+Hacer()

Comando2

Comando1
+Commando1(Estado)
+Hacer()

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

ICommand

+Hacer()
+DesHacer()

Comando1

+Comando1(Estado)
+Hacer()
+Deshacer()

Comando2

+Comando2(Estado)
+Hacer()
+Deshacer()
Daniel Mazzini

lista

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

Estado

+CambiarEstado()

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
Observador

Publicador

+Actualizar()

+Agregar(Observador)
+Quitar(Observador)
+Notificar()

foreach Observador item in al


{
Item.Actualizar()
}

Boya

+ObtenerEstado()

Daniel Mazzini

C.Control

+Actualizar()

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

También podría gustarte