Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Patrones
Patrones
Daniel Mazzini
dmazzini@ubicasolutions.com
Ubica Solutions
Conocimientos previos
Conocimientos de POO.
UML (bsico)
C#
Daniel Mazzini
Agenda
Estructurales
Factory Method
Singleton
Abstract Factory
Adapter
Facade
Composite
Comportamiento
Command
State
Observer
Daniel Mazzini
Qu es un patrn de diseo?
Por qu usarlos?
Categorizacin
Problema - Patrn
Daniel Mazzini
Qu es un patrn de
diseo?
Daniel Mazzini
Por qu usarlos?
Mejora en la comunicacin y
documentacin
Categorizacin
Fundamentales
Creacin
Estructura
Desacopla el sistema.
Comportamiento
Problema - Patrn
Abstract Factory
Factory Method
Prototype
Command
Cadena de Responsabilidad
Daniel Mazzini
Abstract Factory
Bridge
Strategy
Template Method
Builder
Daniel Mazzini
Alto acoplamiento
Faade
Mediator
Observer
Adapter
Decorator
Visitor
Daniel Mazzini
Fundamentos de diseo
Daniel Mazzini
Herencia o interfaz
Daniel Mazzini
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
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:
Desventaja de la composicin:
Delegacin
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:
Daniel Mazzini
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
Daniel Mazzini
Patrones de creacin
Propsito:
Cuales veremos?
Factory Method
Singleton
Abstract Factory
Daniel Mazzini
Factory Method
Problema:
Daniel Mazzini
Factory Method
Daniel Mazzini
Daniel Mazzini
Mtodo esttico en
clase abstracta que
retorno instancias.
Constructores privados
o protegidos.
Daniel Mazzini
Daniel Mazzini
Singleton
Problema:
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
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
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:
Daniel Mazzini
Facade
Form Cliente
Form Pedidos
Cliente
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
Daniel Mazzini
Daniel Mazzini
Adapter
Problemas:
Daniel Mazzini
Adapter
IOperacion
Cliente
+Operacion()
ExternoAdaptado
ClaseA
+ExternoAdaptado(Externa)
+Operacion()
+Operacion()
ClaseB
+Operacion()
_externa.DiferenteNombre()
Externa
+DiferenteNombre()
Daniel Mazzini
Daniel Mazzini
Composite
Problema:
Daniel Mazzini
Composite
Almacn
-Productos():ArrayList
+Seleccionar(Especificacion):ArrayList
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
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:
Cuales veremos?
Command
Strategy
State
Daniel Mazzini
Command
Problema:
Daniel Mazzini
Command
Cliente
ICommand
+Hacer()
Comando2
Comando1
+Commando1(Estado)
+Hacer()
+Comando2(Ejecutar)
+Hacer()
Daniel Mazzini
Command
Tambien puedo:
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:
Daniel Mazzini
State
Boya
-EstadoActual:Estado
Estado
+CambiarEstado()
Estado
+CambiarEstado()
Estado
+CambiarEstado()
Daniel Mazzini
Observer
Problema:
Tipos de objetos:
Daniel Mazzini
Observer
Observador
Publicador
+Actualizar()
+Agregar(Observador)
+Quitar(Observador)
+Notificar()
Boya
+ObtenerEstado()
Daniel Mazzini
C.Control
+Actualizar()
Otras consideraciones
Daniel Mazzini
Conclusiones