Escolar Documentos
Profissional Documentos
Cultura Documentos
Patrones de Diseo
Judith Meles
Laura Covaro
Elizabeth Jeinson
Gerardo Boiero Rovera
Laura Alarcn
Cecilia Massano
Patrones de Diseo
Refinan un subsistema o componente de un sistema software.
Describen una estructura a la cual muchas veces recurrimos para
resolver problemas de diseo.
Patrones de escala media.
No afectan a la arquitectura de un sistema
No dependen del lenguaje de implementacin.
Permiten resolver problemas complejos y direccionan la
cooperacin efectiva entre componentes
La diferencia es el alcance.
En general, tanto los patrones de diseo como los idiomas
describen soluciones a problemas de diseo recurrentes.
Patrones
Describen un problema recurrente y una solucin.
Cada patrn nombra, explica, evala un diseo
recurrente en sistemas OO.
Elementos principales:
Nombre
Problema
Solucin: Descripcin abstracta
Consecuencias
Ing. Judith Meles
El nombre
Se debe poder describir con una o dos
palabras un problema, sus soluciones y la
consecuencia.
El problema
Describe cuando se puede aplicar el patrn. Explica
el problema y su contexto.
La Solucin
Describe los elementos que forman el diseo, sus
relaciones, responsabilidades, y cooperaciones.
Las consecuencias
Los buenos resultados e inconveniencia de
aplicar el patrn.
Plantilla de definicin
Nombre
Propsito
Qu hace? Cul es su razn y propsito?
Qu cuestin de diseo particular o problema aborda?
Sinnimos
Motivacin
Escenario que ilustra un problema particular y cmo el patrn
lo resuelve.
Plantilla de definicin
Aplicabilidad
En qu situaciones puede aplicarse?, Cmo las reconoces?,
ejemplos de diseos que pueden mejorarse.
Estructura
Diagramas de clases que ilustran la estructura
Participantes
Clases que participan y sus responsabilidades
Colaboraciones
Diagramas de interaccin que muestran cmo colaboran los
participantes.
Ing. Judith Meles
10
Plantilla de definicin
Consecuencias
Implementacin
Ejemplo de Cdigo
Usos conocidos
Patrones relacionados
Ing. Judith Meles
11
12
13
Tarea difcil
Debemos considerar: encapsulamiento, flexibilidad,
dependencias, reutilizacin, extensibilidad, rendimiento,
Clases del anlisis vs. Clases del diseo
Clases del diseo no tienen contrapartida en el dominio
Fabricacin Pura
Clases del diseo son claves para hacer el sistema ms
flexible.
14
Especificar interfaces
15
16
17
18
19
Clasificacin
Creacin
mbito Clase
Objeto
Factory Method
Abstract Factory
Builder
Prototype
Singleton
Propsito
Estructural
Adapter
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Comportamiento
Interpreter
Template Method
Chain of Responsability
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor
20
10
Patrones de Creacin
Abstraen el proceso de creacin de objetos.
Ayudan a crear sistemas independientes de cmo los objetos
son creados, compuestos y representados.
Dos tipos:
Clase: usa herencia para variar la clase que es
instanciada.
Objeto: delega instanciacin a otro objeto.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
21
Patrones de Creacin
Se encapsula:
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
22
11
Patrones de Creacin
Abstract Factory (Fbrica Abstracta): Proporciona una interfaz para crear familias
de objetos relacionados o que dependen entre s, sin especificar sus clases
concretas.
Factory Method (Mtodo de Fabricacin): Define una interfaz para crear un objeto,
pero deja que las subclases deciden que clase instanciar. Delega en las subclases
la creacin de objetos.
Singleton (nico): Garantiza que una clase tenga una nica instancia y
proporciona un punto de acceso global a ella.
Builder (Constructor): Separa la construccin de un objeto complejo de su
representacin, de forma que el mismo proceso de construccin pueda crear
diferentes representaciones.
Prototype (Prototipo):Especifica los tipos de objeto a crear por medio de una
instancia prototpica, y crea nuevos objetos copiando de este prototipo.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
23
Patrones de Estructura
Determinan cmo combinar objetos y
clases para definir estructuras
complejas.
Comunicar dos clases incompatibles,
Aadir funcionalidad a objetos
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
24
12
Patrones de Estructura
Adapter (Adaptador): Convierte la interfaz de una clase en otra distinta que es la que
esperan los clientes. Permite que cooperen las clases que de otra manera tendran
interfaces incompatibles.
Bridge (Puente): Desacopla una abstraccin de su implementacin, de manera que ambas
puedan variar de forma independiente.
Composite (Compuesto):Combina objetos en estructuras de rbol para representar jerarquas
de todo-parte. Permite que los clientes traten de manera uniforme a los objetos individuales y a
los compuestos.
Decorator (Decorador): Aade dinmicamente nuevas responsabilidades a un objeto,
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
25
Patrones de Comportamiento
Se ocupan de los algoritmos y reparto de responsabilidades.
Describen los patrones de comunicacin entre objetos y clases.
Podremos definir abstracciones de algoritmos (Template Method)
Cooperaciones entre objetos para realizar tareas complejas, reduciendo
las dependencias entre objetos (Iterator, Observer, etc.)
Asociar comportamiento a objetos e invocar su ejecucin (Command,
Strategy, etc.)
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
26
13
Patrones de Comportamiento
Chain of Responsibility (Cadena de Responsabilidad): Evitar acoplar el emisor de una
gramtica junto con un intrprete que usa dicha representacin para interpretar
sentencias del lenguaje.
Iterator (Iterador): Proporciona un modo de acceder secuencialmente a los elementos
de un objeto agregado sin exponer su representacin interna.
Mediator (Mediador): Define un objeto que encapsula cmo interactan los objetos.
Promueve un bajo acoplamiento al evitar que los objetos se refieran uno a otros
explcitamente, y permite variar la interaccin entre ellos de forma independiente.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
27
28
14
Modelo de Dominio
(Se muestra la parte RELEVANTE del Modelo de Dominio, es decir las clases que se utilizarn en la aplicacin de los patrones
a desarrollar.)
1
0..*
Cliente
MarcaTarjetaCredito
PreferenciaCliente
LinkFavorito
1..*
1
0..*
TarjetaCreditoCliente
MovimientoStockArticulo
1
ArticuloEspecifico
1
MedioSoporte
1..*
1..*
TipoReferencia
TipoProductora
Productora
MotivoNoEntrega
0..1
0..*
0..*
Articulo
0..*
-idiomaOriginal
1
0..*
DetalleOrdenDespacho
0..*
0..*
1..*
SeccionCatalogo
+traduccion
1
1
Idioma
0..*
Comentario
0..1
1
Pedido
PrecioEnvio
1..*
-subtitulado
JuegoVideo
Catalogo
1..*
1
1
1..*
Elenco
1..*
EmpresaTransporte
1
0..*
PuntoDistribucion
DetallePedido
1
GeneroMusical
EstadoPedido
1
1..* Autor
1..*
Interprete
Calificacion
1
1..*
1..*
FormaEnvio
Tematica
Musica
Pelicula
1
EstadoDespacho
0..*
0..*
Libro
1..*
Referencia
Imagen
OrdenDespacho
0..*
DetalleRemito
Destino
1..*
TemaMusical
1..*
1
MedioTransporte
0..*
Remito
1..*
0..*
Localidad
Rubro
EstadoRemito
1..*
EmpresaTransporteAsignada
Rol
29
Singleton
Propsito
Asegurar que una clase tiene una nica instancia y asegurar un acceso global
Motivacin
La clase se encarga de asegurar que exista una nica instancia y de su acceso.
Caches
Cajas de Dilogo
Objetos que manejan preferencias y configuraciones de registros.
Objetos utilizados para logueo
Objetos manejadores de dispositivos como impresoras o tarjetas grficas.
Para estos objetos, instanciar ms de uno provocara toda clase de problemas como:
funcionamiento incorrecto, sobreuso de recursos, resultados inconsistentes.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
30
15
Singleton
Estructura
31
Singleton
Aplicabilidad
Consecuencias
Debe validarse que haya una nica instancia y que la instancia sea la
que queremos
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
32
16
Singleton: Aplicacin
class Singleton
singleton
NumeroPedido
control
GestorPedido
Estructura
+ actualizarNroPedido() : void
+ calcularNumeroPedido() : int
+ crearPedido() : void
entity
Pedido
-
numero: int
+ new(nro :int)
instancia: NumeroPedido
numero: int
+ actualizarNumero() : void
+ getNumero() : int
- new()
static
+ getInstancia() : NumeroPedido
El mtodo getInstancia() es
ESTTICO. Se ocupa de crear la
instancia nica -atributo instanciasino existe an en memoria.
33
Singleton: Aplicacin
Participantes
El Singleton tiene un atributo esttico para mantener la referencia a la instancia nica y uno o
ms atributos que guardan el estado relevante del objeto -el ltimo nmero asignado. Crea la
instancia nica y le devuelve al Gestor el nmero.
El gestor de pedido invoca el mtodo new() del pedido pasndole como parmetro entre
otras cosas el nmero de pedido que corresponde y luego le pide al Singleton que actualice
el valor del atributo esttico.
34
17
Singleton:
Aplicacin
sd Singleton
singleton
:NumeroPedido
:GestorPedido
Dinmica
crearPedido()
calcularNumeroPedido() :int
getInstancia() :NumeroPedido
new()
getNumero() :int
Ventaja
Permite un acceso controlado
a la nica instancia ya que
posee un control estricto
sobre cmo y cundo acceden
a ella.
new(nro :int)
:Pedido
actualizarNroPedido()
getInstancia() :NumeroPedido
actualizarNumero()
35
State (Estado)
Propsito
Motivacin
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
36
18
State
37
State
Aplicabilidad
38
19
State
Consecuencias
39
State : Aplicacin
Estructura
class State
entity
Pedido
state
Preparado
entity
EstadoPedido
numero: int
detalle: DetallePedido[]
estado: EstadoPedido
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1 +
+
+
+
+
+
1 +
+
+
+
+
nombre: String
ambito: String
textoAyuda: String
getNombre() : String
cancelar() : Cancelado
estaEntregado() : boolean
confirmarPedido() : void
entregar() : Finalizado
preparar() : EnPreparacion
deshacerPreparacion() : void
estaCancelado() : boolean
despachar() : Despachado
cancelarPreparacion() : EnPreparacion
permiteAgregarACarro() : boolean
esPendiente() : boolean
state
PendienteDePreparacion
+
1..*
entity
DetallePedido
-
articuloEspecifico: ArticuloEspecifico
cantidad
precioUnitario
estado: EstadoPedido
+
+
+
+
+
+
+
+
+
+
+
new()
state
Finalizado
+
new()
cancelar() : Cancelado
preparar() : EnPreparacion
deshacerPreparacion() : Confirmado
estaEntregado() : boolean
state
Despachado
+
entregar() : Finalizado
state
EnPreparacion
+
+
+
cancelar() : Cancelado
preparar() : EnPreparacion
despachar() : Despachado
estaCancelado() : boolean
state
Confirmado
+
+
+
+
state
EnCarroDeCompra
+
+
+
+
cancelar() : Cancelado
despachar() : Despachado
cancelarPreparacion() : EnPreparacion
state
Cancelado
40
20
State: Aplicacin
Participantes
Procedimiento
41
State: Aplicacin
Dinmica:
sd State
state
:EnCarroDeCompra
:GestorPedido
:Pedido
agregarArticulo(art :
ArticuloEspecifico, cant
:int, precio :double)
agregarArticulo(art :
PrecioArticulo, cant :int, prec :
double) :DetallePedido
new()
state
:PendienteDePreparacion
crearDetalle(a :ArticuloEspecifico, c :
int, p :double, est :EstadoPedido) :
DetallePedido
new(a :Articulo, c :int, p :double, est :
EstadoPedido)
:DetallePedido
Ventajas:
42
21
Strategy/Policy (Estrategia)
Propsito
Motivacin
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
43
Strategy
Estructura
Herencia
44
22
Strategy
Estructura
Realizacin
45
Strategy
Aplicabilidad
46
23
Strategy
Consecuencias
Estructura
47
Strategy: Aplicacin
class Strategy-Ejecucion
control
GestorAdministradorSesion
interface
IEstrategiaCierreSesion
sesionesAbiertas: SesionUsuario[]
cuandoCerrarSesion: IEstrategiaCierreSesion[]
+
+
+
+
ejecutarCierre() : void
buscarEstrategiasCierreSesion() : void
agregarEstrategiaCierre(est :IEstrategiaCierreSesion) : void
quitarEstrategiaCierre(est :IEstrategiaCierreSesion) : void
entity
SesionUsuario
-
fechaHoraInicio: Date
fechaHoraFin: Date
estrategia
CierrePorLimiteTransacciones
estrategia
CierrePorTiempoInactividad
-
duracion: int
activa: boolean
cantTransaccionesPermitidas: int
activa: boolean
+ cerrar() : void
+ haCaducado() : boolean
Ing. Judith Meles
48
24
Strategy : Aplicacin
Participantes
Estrategia [IEstrategiaCierreSesion]:
Declara una interfaz comn a todos los algoritmos permitidos que define los mtodos
disponibles para ser utilizados por el cliente.
Contexto [GestorAdministradorSesion]
Es la clase que utiliza las diferentes estrategias para ciertas tareas. Mantiene una referencia a
una o ms instancias Estrategia Concreta, que podrn ser configurables en tiempo de
ejecucin.
La configuracin puede ser de una o varias estrategias, y debe realizarse antes de invocarse el
mtodo de variacin algortmica de cada una de las Estrategias Concretas.
El Contexto es responsable establecer la/s estrategia/s a utilizar y de ejecutar el o los mtodos
variables.
49
Strategy: Aplicacin
Procedimiento
50
25
Dinmica
Strategy: Aplicacin
sd Strategy-Ejecucion
estrategia
:CierrePorLimiteTransacciones
:GestorAdministradorSesion
estrategia
:CierrePorTiempoInactividad
:SesionUsuario
buscarEstrategiasCierreSesion()
Primero, en el Contexto se
setea en tiempo de
ejecucin la Estrategia
Concreta configurada en los
Parmetros del Sistema
para gestionar los cierres
de sesin.
estaActiva() :boolean
:false
estaActiva() :boolean
:true
agregarEstrategiaCierre(est :IEstrategiaCierreSesion)
ejecutarCierre()
cerrarSesion(sesiones :SesionUsuario[])
51
State / Strategy
El Patrn State permite a un objeto tener varios comportamientos diferentes que estn basados en su
estado interno.
A diferencia de una mquina de estados procedural, el patrn State representa un estado como una
clase completa.
El contexto obtiene su comportamiento delegando al estado actual del objeto por el que est
compuesto.
Encapsulando cada estado en una clase, localizamos cualquier cambio que sea necesario hacer.
Los patrones STATE/STRATEGY tienen el mismo diagrama de clases, pero con una intencin
diferente.
El patrn STRATEGY comnmente configura la clase contexto con un comportamiento o algoritmo.
Las transiciones de los estados pueden ser controladas por las clases estado o por las clases
contexto.
La utilizacin del patrn STATE resultar en un incremento en el nmero de clases de su diseo.
Las clases estado pueden compartirse entre instancias de contexto.
Ing. Judith Meles
52
26
Template Method
Propsito
Motivacin
Estructura
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
53
Template Method
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
54
27
Template Method
Aplicabilidad
Implementar las partes fijas de un algoritmo y dejar que las
subclases implementen el comportamiento que puede variar.
Cuando el comportamiento comn entre varias subclases debe
ser factorizado y localizado en una superclase comn.
Controlar extensiones de las subclases: algoritmos con puntos
de extensin
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
55
Template Method
Consecuencias
Tcnica fundamental para la reutilizacin: factorizar comportamiento comn en
libreras de clases
Estructura de control invertida conocida como Principio de Hollywood: No
nos llames, nosotros te llamaremos.
Un mtodo plantilla (template) invoca a los siguientes tipos de mtodos:
operaciones concretas en la subclase concreta o en clientes
operaciones concretas en la clase abstracta
operaciones abstractas (primitivas)
mtodos factora (uso combinado con el Factory Method)
mtodos hook que proporcionan comportamiento por defecto que se
implementa en la clase abstracta y que las subclases pueden utilizar o
ignorar en funcin de lo que necesiten. Tambin puede estar vaco.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
56
28
Template Method
Implementacin
57
Template
Method:
Aplicacin
control
GestorCatalogo
+
entity
Articulo
Estructura
codigo: String
titulo: String
productora: Productora[]
idiomaOriginal: Idioma[]
+
+
+
+
+
+
+
+
getCodigo() : String
getIdiomaOriginal() : Idioma
getTitulo() : String
conocerProductora() : String[]
conocerIdiomaOriginal() : String[]
mostrarInfoProducto() : String[]
mostrarInfoEspecfica() : String[]
conocerTraducciones() : String[]
1..*
nombre: String
getNombre() : String
entity
Pelicula
entity
Productora
entity
Idioma
+
calificacion: Calificacion
rubro: Rubro
idiomaSubtitulo: Idioma
+
+
+
+
getCalificacion() : Calificacion
getIdiomaSubtitulo() : Idioma[]
mostrarInfoEspecfica() : String[]
conocerTraducciones() : String[][]
0..*
1
nombre: String
entity
Calificacion
getNombre() : String
entity
Rubro
nombre: String
nombre: String
getNombre() : String
getNombre() : String
58
29
Template
Method:
Aplicacin
59
sd Template Method
:GestorCatalogo
:Pelicula
:Productora
:Idioma :Calificacion
:Rubro
conocerArticulo(Articulo) :String[]
mostrarInfoProducto() :String[]
getTitulo() :String
conocerProductora() :String
*getNombre() :String
conocerIdiomaOriginal() :String
getNombre() :String
Dinmica
Los mtodos
"mostrarInfoEspecfica()"
y "conocerTraducciones
()" varan en cada
subclase correspondiente
a un tipo de producto.
mostrarInfoEspecfica() :String[]
getNombre() :String
getNombre() :String
conocerTraducciones() :String[]
getIdiomaSubtitulo() :Idioma
*getNombre() :String
60
30
61
Factory Method
Propsito
Motivacin
62
31
Factory Method
Estructura
Creador
metodoDeFabricacion()
unaOperacion()
Producto
ProductoConcreto
<<crea>>
CreadorConcreto
...
producto = metodoDeFabricacion()
...
metodoDeFabricacion()
Herencia
Ing. Judith Meles
63
Estructura
Factory Method
interface
ICreador
interface
IProducto
+ metodoDeFabricacion()
+ unaOperacion()
ProductoConcreto
CreadorConcreto
crea
+ metodoDeFabricacion()
return new()
productoConcreto
Realizacin
Ing. Judith Meles
64
32
Factory Method
Aplicabilidad
Una clase no puede anticipar la clase de
objetos que debe crear.
Una clase desea que sus subclases
especifiquen los objetos que debe crear.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
65
Factory Method
Consecuencias
66
33
Factory Method
Implementacin
Dos posibilidades
67
entity
Pelicula
entity
Libro
entity
JuegoVideo
entity
Musica
control
GestorLibro
-
autor: Autor[]
isbn: int
resumen: String
tematica: Tematica
+
+
crearArticulo() : void
tomarConfirmacionArticulo() : void
control
GestorMusica
+
crearArticulo() : void
control
GestorJuegoVideo
interface
IGestorArticulo
control
GestorPelicula
+
crearArticulo() : void
crearArticulo() : void
crearArticulo() : void
boundary
PantallaAdmArticulo
68
34
Producto [Articulo]:
Creador [IGestorArticulo]:
69
:PantallaAdmArticulo
:GestorLibro
tomarConfirmacionArticulo()
Toda la informacin
para crear una
instancia de Libro
estn en el gestor.
crearArticulo()
new(isbn :int, autor :Autor[],
tematica :Tematica,
resumen :String)
:Libro
70
35
71
Faade / Fachada
Propsito
Motivacin
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
72
36
Estructura
Fachada
73
Faade / Fachada
Aplicabilidad
74
37
Faade / Fachada
Consecuencias
75
cmp Facade
Faade:
Aplicacin
GestionVenta
use
GestionDestino
fachada
FachadaEnvio
Estructura
+
+
+
+
+
+
listarDestinosActivos() : String[]
distribuyeALocalidad(loc :Localidad) : boolean
listarEmpresasTransporte() : String[]
existeDestino(dest :Destino) : boolean
listarFormasEnvio() : String[]
new()
entity
Localidad
entity
FormaEnvio
-
nombre: String
getNombre() : String
-localidad
entity
Destino
entity
EmpresaTransporte
razonSocial: String
getRazonSocial() : String
nombre: String
localidad: Localidad
activo: boolean
+
+
estActivo() : boolean
getNombre() : String
76
38
Faade: Aplicacin
Participantes
Fachada [FachadaEnvio]: Conoce las clases del subsistema que son
responsables ante una peticin. Se ocupa de delegar las solicitudes de
los clientes en los objetos apropiados.
Clases del Subsistema: implementan la funcionalidad del subsistema y
realizan las tareas solicitadas por la fachada.
Procedimiento
77
sd Facade
Faade:
Aplicacin
:GestorPedido
:Destino
new()
:FormaEnvio
fachada
:FachadaEnvio
listarDestinosActivos() :String[]
Dinmica:
*estActivo() :boolean
*getNombre() :String
listarFormasEnvio() :String[]
*getNombre() :String
Ventajas:
Disminuye el acoplamiento entre un subsistema y sus clientes.
Ocultar a los clientes los componentes de un subsistema .
78
39
Composite
Propsito
Motivacin
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
79
Composite
Estructura
Componente
Cliente
operacion()
aadir(Componente)
eliminar(Com ponente)
obtenerHijo()
hijos
Herencia
Compues to
Hoja
operacion()
operacion()
aadir(Componente)
eliminar(Com ponente)
obtenerHijo()
80
40
Estructura
Composite
Realizacin
81
Composite
Aplicabilidad
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
82
41
Composite
Consecuencias
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
83
Composite
Implementacin
84
42
Aplicacin:
Composite
class Composite
interface
IComponenteCatalogo
control
GestorCatalogo
-
catalogo :IComponenteCatalogo
+ crearIterador(Object[]) :IIterador
+ listarCatalogo() :String[][]
+
+
+
+
agregarComponente(IComponenteCatalogo) :void
getDescripcionJerarquia() :String[]
obtenerHijo() :IComponenteCatalogo
quitarComponente(IComponenteCatalogo) :void
1..*
CompuestoCatalogo
entity
Articulo
Estructura:
activo :boolean
codigo :String
titulo :String
+
+
+
+
+
agregarComponente(IComponenteCatalogo) :void
getDescripcionJerarquia() :String[]
getTitulo() :String
obtenerHijo() :IComponenteCatalogo
quitarComponente(IComponenteCatalogo) :void
entity
Pelicula
agrupaArtDestacados :boolean
compontente :IComponenteCatalogo[]
diseoGrafico :String
fechaCreacion :Date
fechaFin :Date
fechaInicio :Date
nivel :int
nombre :String
+
+
+
+
+
agregarComponente(IComponenteCatalogo) :void
getDescripcionJerarquia() :String[]
getNombre() :String
obtenerHijo() :IComponenteCatalogo
quitarComponente(IComponenteCatalogo) :void
entity
Musica
entity
Libro
entity
JuegoVideo
85
Composite
Participantes
Componente (IComponenteCatalogo)
Compuesto (CompuestoCatalogo)
Cliente (GestorCatalogo)
86
43
Aplicacin: Composite
Dinmica
sd Composite
catalogo
:CompuestoCatalogo
musicaInternacional
:CompuestoCatalogo
theBeatles
:CompuestoCatalogo
:GestorCatalogo
letItBe
:Musica
listarCatalogo() :String[][]
getDescripcionJerarquia() :
String[]
getNombre() :String
*getDescripcionJerarquia() :String[]
getNombre() :String
*getDescripcionJerarquia() :
String[]
getNombre() :String
*getDescripcionJerarquia() :String[]
getTitulo() :String
87
Composite
Procedimiento
El GestorCatalogo debe armar y mostrar toda la jerarqua del catlogo activo (X secciones, Y
subsecciones y Z artculos) cuando el usuario desea consultarlo, para lo cual le pide a la
interfaz (IComponenteCatalogo) que lo resuelva a travs del mtodo:
getDescripcinJerarqua().
En el caso del ejemplo, el Catlogo est compuesto por Secciones (Msica Internacional),
Subsecciones (The Beatles) y debe recorrer los artculos que lo componen (Let It Be). Esto es
posible gracias al objeto Compuesto.
En la segunda parte del ejemplo, se debe recuperar el nombre de un artculo (hoja), para ello no
es necesario que intervenga el objeto Compuesto.
De esa manera el GestorCatalogo obtiene el nombre de cada elemento del catlogo y su ruta
de ubicacin, sin necesidad de conocer la cantidad de niveles de divisin del catlogo.
88
44
Observer / Publish-Subscribe
Propsito
Motivacin
90
Motivacin 2tr
90
80
70
60
Vistas
4tr
Este
Oeste
Norte
50
40
30
20
1tr
3tr
10
0
1er trim. 2do trim. 3er trim. 4to trim.
Modelo
t1=20
t2=25
t3=90
t4=20
Ing. Judith Meles
Este
Oeste
Norte
1tr.
20
30
47
2tr.
25
38
47
3tr. 4tr.
90 20
32 32
45 45
91
45
Observer
Estructura
Herencia
92
Observer
Estructura
Realizacin
ISujeto
IObservador
separar(observador)
adjuntar(observador)
notificar()
1..*
SujetoConcreto
estadoSujeto
setEstado()
getEstado()
actualizar(sujeto)
ObservadorConcreto
estadoObservador
+theSujetoConcreto
actualizarEstado()
estadoObservador= Sujeto
-> getEstado()
93
46
Observer
Colaboracin
: Otra
: Sujeto
1. setEstado( )
o1 :
Observador
o2 :
Observador
1.1. notificar( )
1.1.1. actualizar( )
1.1.2. actualizar( )
94
Observer
Aplicabilidad
95
47
Observer
Consecuencias
Permite modificar independientemente subjects y observers.
Acoplamiento abstracto y mnimo entre Subject y Observer:
pueden reutilizarse por separado
observers pueden aadirse sin modificar el subject
Subject no necesita conocer las clases concretas de
Observers
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
96
Observer
Consecuencias
Soporte para comunicacin de tipo broadcast:
Actualizaciones inesperadas
Interfaz de Observer simple requiere que los
observers tengan que deducir el tem cambiado
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
97
48
Observer
Cuando la semntica de las actualizaciones es compleja, puede ser
necesario que un objeto mantenga esas relaciones,
GestorDeCambios.
El propsito del GestorDeCambios es minimizar el trabajo necesario
para lograr que los observadores reflejen el cambio en su sujeto.
GestorDeCambios tiene las siguientes responsabilidades:
Corresponder a un sujeto con sus observadores.
Definir una determinada estrategia de actualizacin
Actualiza todos los observadores dependientes a peticin de un sujeto.
El GestorDeCambios es una instancia del patrn Mediator y como
slo hay un nico GestorDeCambios el patrn Singleton es de
utilidad aqu.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
98
Observer : Aplicacin
Consecuencias
99
49
Observer : Aplicacin
Estructura con Gestor de Cambios
Herencia
Ing. Judith Meles
100
Observer : Aplicacin
Estructura con Gestor de Cambios
Realizacin
Ing. Judith Meles
101
50
Observer : Aplicacin
class Observer-Pull
interface
ISujetoNoficacionPedido
private
+ observador :IObserverNotificacionPedido[]
interface
IObserverNotificacionPedido
0..* + enviarMail(p :Pedido) :void
+ notificar() :void
+ quitar(o :IObserverNotificacionPedido) :void
+ suscribir(o :IObserverNotificacionPedido) :void
boundary
NotificacionEnvioParcial
+ enviarMail(p :Pedido) :void
- generarMail() :void
control
GestorPedido
control
GestorEnvio
+ notificar() :void
+ quitar(o :IObserverNotificacionPedido) :void
+ suscribir(o :IObserverNotificacionPedido) :void
numeroPedido :int
+
+
+
+
notificar() :void
quitar(o :IObserverNotificacionPedido) :void
suscribir(o :IObserverNotificacionPedido) :void
tomarConfirmacion() :void
boundary
NotificacionConfirmacionPedido
+ enviarMail(p :Pedido) :void
- generarMail() :void
+ new() :void
-pedido
boundary
PantallaCrearPedido
+ pedirConfirmacionPedido() :void
entity
Pedido
-
detalle :DetallePedido[]
estado :EstadoPedido
numero :int
+
+
+
+
+
confirmarPedido() :void
getNumero() :int
listarArticulosPedido() :String[][]
quitarArticulo()
setEstado(nuevo :EstadoPedido) :void
boundary
NotificacionDespachoRetrasado
+ enviarMail(p :Pedido) :void
- generarMail() :void
Estructura (PULL)
102
Observer : Aplicacin
Participantes
103
51
Observer : Aplicacin
Dinmica
sd Observer-Pull
state
:EnCarroDeCompra
:PantallaCrearPedido
:GestorPedido
:Pedido
tomarConfirmacion()
confirmarPedido()
confirmarPedido()
new()
state
:Confirmado
setEstado(nuevo :
EstadoPedido)
new()
:NotificacionConfirmacionPedido
suscribir(o :IObserverNotificacionPedido)
notificar()
enviarMail(p :Pedido)
generarMail()
getNumero() :int
listarArticulosPedido() :String[]
104
Observer: Aplicacin
Procedimiento
Cuando se produce un cambio en el estado del pedido, el se deber
notificar a todos los suscriptos (InterfazNotificacion), para que realicen la
notificacin correspondiente en funcin del estado del Pedido.
El GestorPedido corrobora que el estado del pedido se ha modificado,
por lo que llama a su mtodo notificar() e informa a las Notificaciones.
En funcin del estado del pedido se analiza que Notificacin
corresponde que ejecute el mtodo enviarMail() declarado en la interfaz
IObserverNotificacionPedido.
El mtodo generarMail() que se implementa en cada Notificacin
concreta que corresponda, pide las actualizaciones que corresponden,
en este caso al objeto Pedido.
105
52
Observer : Aplicacin
class Observer-Push
interface
ISujetoNoficacionPedido
interface
IObserverNotificacionPedido
private
+ observador :IObserverNotificacionPedido[]
0..* + actualizar(nroPed :int, fecha :Date, email :String, detalle :String[], texto :String) :void
+ notificar() :void
+ quitar(o :IObserverNotificacionPedido) :void
+ suscribir(o :IObserverNotificacionPedido) :void
boundary
NotificacionDespachoRetrasado
control
GestorEnvio
control
GestorPedido
+ notificar() :void
+ quitar(o :IObserverNotificacionPedido) :void
+ suscribir(o :IObserverNotificacionPedido) :void
numeroPedido :int
+
+
+
+
notificar() :void
quitar(o :IObserverNotificacionPedido) :void
suscribir(o :IObserverNotificacionPedido) :void
tomarConfirmacion() :void
+ actualizar(nroPed :int, fecha :Date, email :String, detalle :String[], texto :String) :void
- generarMail() :void
boundary
NotificacionEnvioParcial
boundary
PantallaCrearPedido
-pedido
+ actualizar(nroPed :int, fecha :Date, email :String, detalle :String[], texto :String) :void
- generarMail() :void
+ confirmarPedido() :void
entity
Pedido
-
boundary
NotificacionConfirmacionPedido
detalle :DetallePedido[]
estado :EstadoPedido
Estructura (Push)
+ confirmarPedido() :void
+ setEstado(nuevo :EstadoPedido) :void
+ actualizar(nroPed :int, fecha :Date, email :String, detalle :String[], texto :String) :void
- generarMail() :void
+ new() :void
106
Observer : Aplicacin
Dinmica
sd Observer-Push
state
:EnCarroDeCompra
:PantallaCrearPedido
:GestorPedido
:Pedido
tomarConfirmacion()
confirmarPedido()
confirmarPedido()
new()
state
:Confirmado
setEstado(nuevo :EstadoPedido)
new()
:NotificacionConfirmacionPedido
suscribir(o :IObserverNotificacionPedido)
notificar()
actualizar(nroPed :int, fecha :Date, email :String, detalle :String[], texto :String)
generarMail()
Tras producirse el cambio de estado del Pedido, se notifica y se enva datos forzosamente a los
observadores suscriptos al sujeto GestorPedido. Luego los Observadores disponen de esos
datos para realizar sus operaciones.
107
53
Observer : Aplicacin
Participantes
108
Observer : Aplicacin
Procedimiento
Notificacin de que el pedido ha sido registrado
El GestorPedido manda la confirmacin al Pedido, el Pedido
delega esa confirmacin al estado que se encuentra Carrito.
El Carrito crea el nuevo estado Confirmado y se lo devuelve al
Pedido.
El GestorPedido debe notificar el cambio de estado y llama a su
mtodo notificar() y actualiza las pantallas de Notificacion.
En funcin del estado del pedido se analiza que Notificacion
corresponde que ejecute el mtodo actualizar() declarado en la
interfaz IObserverNotificacionPedido.
La pantalla NotificacionConfirmacionPedido, es quien debe hacer
algo en este caso, el mtodo actualizar() llama al mtodo concreto
generarMail() de la Notificacion concreta que corresponda.
Ing. Judith Meles
109
54
Iterator (Iterador)
Propsito
Proporciona una forma para acceder a los elementos de una
estructura de datos sin exponer los detalles de la
representacin.
Motivacin
Un objeto contenedor tal como una lista debe permitir una
forma de recorrer sus elementos sin exponer su estructura
interna.
Debera permitir diferentes mtodos de recorrido.
Debera permitir recorridos concurrentes.
No queremos aadir esa funcionalidad a la interfaz de la
coleccin.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
111
Iterator (Iterador)
Motivacin
112
55
Iterator
Consecuencias
Simplifica la interfaz de un contenedor
al extraer los mtodos de recorrido
Permite varios recorridos, concurrentes
Soporta variantes en las tcnicas de
recorrido
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
113
114
56
115
class Iterator-Seccion
interface
IIterador
interface
IAgregado
+
+
+
+
+
+
actual() :Object
cumpleFiltro(filtros :String[]) :boolean
haTerminado() :boolean
primero() :Object
siguiente() :Object
entity
Catalogo
Estructura
seccion :SeccionCatalogo[]
+
+
+
+
+
+
+
+
buscarSeccionArtDestacados()
getArticulo() :Articulo
getRangoVigencia()
getSeccion() :SeccionCatalogo
listarArticulosDestacados()
listarArticulosPorSeccion()
listarNombreSecciones() :String[]
listarNombreSubsecciones() :String[]
-seccion
1..*
entity
SeccionCatalogo
iterator
IteradorSeccion
-
actual :int
elementos :Object[]
+
+
+
+
+
actual() :Object
haTerminado() :boolean
new(elem :Object[])
primero() :Object
siguiente() :Object
0..*
-subseccion
agrupaArtDestacados :boolean
nombre :String
+
+
+
+
agrupaArtDestacados() :void
crearIterador(elementos :Object[]) :IIterador
getNombre() :String
listarArticulos() :String[]
Iterator:
Aplicacin
116
57
Iterator: Aplicacin
Estructura
class Iterator-Articulo
interface
IIterador
+
+
+
+
+
interface
IAgregado
+
actual() :Object
cumpleFiltro(filtros :String[]) :boolean
haTerminado() :boolean
primero() :Object
siguiente() :Object
iterator
IteradorArticulo
entity
Catalogo
-
nombre
seccion :SeccionCatalogo[]
+
+
+
+
+
+
+
+
buscarSeccionArtDestacados()
getArticulo() :Articulo
getRangoVigencia()
getSeccion() :SeccionCatalogo
listarArticulosDestacados()
listarArticulosPorSeccion()
listarNombreSubsecciones() :String[]
listarPorSeccion() :String[][]
-seccion
1..*
entity
SeccionCatalogo
-
agrupaArtDestacados :boolean
articulo :Articulo[]
+
+
+
agrupaArtDestacados() :void
crearIterador(elementos :Object[]) :IIterador
listarArticulos() :String[]
actual :int
elementos :Object[]
+
+
+
+
+
+
actual() :Object
cumpleFiltro(filtros :String[]) :boolean
haTerminado() :boolean
new(elem :Object[], filtros :String[]) :void
primero() :Object
siguiente() :Object
0..* -subseccion
entity
Articulo
-articulo 0..* +
+
+
activo :boolean
titulo :String
estaActivo() :boolean
getTitulo() :String
tieneImagen()
117
Iterator: Aplicacin
Participantes
Iterador [IIterador]: interfaz que permite recorrer los elementos y acceder a ellos.
IteradorConcreto [IteradorArticulos, IteradorSecciones]: implementa la interfaz
Iterador y mantiene la posicin actual en el recorrido del Agregado.
Agregado [IAgregado]: define una interfaz para crear un objeto Iterador
AgregadoConcreto [Catlogo, SeccionCatalogo]: implementa la interfaz de creacin
de Iterador para devolver una instancia de un Iterador concreto (IteradorArticulos o
IteradorSecciones).
Procedimiento
118
58
Iterator: Aplicacin
Dinmica:
sd Iterator-Seccion
:GestorCatalogo
:Catalogo
:SeccionCatalogo
listarArticulosDestacados()
listarNombreSecciones() :
String[]
crearIterador(elementos :
Object[]) :IIterador
new(elem :Object[])
iterator
:IteradorSeccion
haTerminado() :boolean
[haTerminado():=false]
siguiente() :Object
getNombre() :String
119
Iterator: Aplicacin
Dinmica:
sd Iterator-Articulo
:GestorCatalogo
:Catalogo
:SeccionCatalogo
:JuegoVideo
listarPorSeccion() :String[][]
*listarArticulos() :String
crearIterador(elementos :Object[]) :IIterador
new(elem :Object[], filtros :String[])
iterator
:IteradorArticulo
haTerminado() :boolean
siguiente() :Object
cumpleFiltro(filtros :String[]) :
boolean
estaActivo() :boolean
getTitulo() :String
120
59
Iterador [IIterador]: interfaz que permite recorrer los elementos y acceder a ellos.
IteradorConcreto [IteradorArticulos, IteradorCompuesto]: implementa la interfaz
Iterador y mantiene la posicin actual en el recorrido del Agregado.
Agregado [IAgregado]: define una interfaz para crear un objeto Iterador
AgregadoConcreto [GestorCatlogo, CompuestoCatalogo]: implementa la interfaz
de creacin de Iterador para devolver una instancia de un Iterador concreto
(IteradorArticulos o IteradorCompuesto).
Procedimiento
121
class Iterator-Composite
interface
IAgregado
+ crearIterador(elementos :Object[]) :IIterador
control
GestorCatalogo
+
+
+
+
+
buscarCatalogoVigente()
crearIterador(elementos :Object[]) :IIterador
finalizarCU() :void
listarCatalogo() :String[][]
listarEstructuraSecciones() :void
Iterator:
Aplicacin
Estructura
Ing. Judith Meles
interface
IIterador
CompuestoCatalogo
-
agrupaArtDestacados :boolean
compontente :IComponenteCatalogo[]
diseoGrafico :String
fechaCreacion :Date
fechaFin :Date
fechaInicio :Date
nivel :int
nombre :String
+
+
+
+
+
+
iterador
IteradorCompuesto
+
+
+
+
+
+
actual() :Object
cumpleFiltro(filtros :String[]) :boolean
haTerminado() :boolean
new(elementos :object[]) :void
primero() :Object
siguiente() :Object
+
+
+
+
+
actual() :Object
cumpleFiltro(filtros :String[]) :boolean
haTerminado() :boolean
primero() :Object
siguiente() :Object
iterator
IteradorArticulo
-
actual :int
elementos :Object[]
+
+
+
+
+
+
actual() :Object
cumpleFiltro(filtros :String[]) :boolean
haTerminado() :boolean
new(elem :Object[], filtros :String[]) :void
primero() :Object
siguiente() :Object
entity
Articulo
-
activo :boolean
titulo :String
+ estaActivo() :boolean
+ getTitulo() :String
+ tieneImagen()
122
60
Dinmica:
sd Iterator-CompuestoCatalogo
catalogo
:CompuestoCatalogo
seccionJuegoVideo
:CompuestoCatalogo
:GestorCatalogo
:JuegoVideo
listarCatalogo() :String[][]
crearIterador(elementos :Object[]) :IIterador
new(elementos :object[])
iterator
:IteradorCompuesto
new()
siguiente() :Object
getDescripcionJerarquia() :String
getNombre() :String
listarArticulosActivos()
crearIterador(elementos :Object[]) :IIterador
new(elem :Object[], filtros :String[])
iterator
:IteradorArticulo
haTerminado() :boolean
siguiente() :Object
cumpleFiltro(filtros :String[]) :boolean
estaActivo() :boolean
getDescripcionJerarquia() :String
getTitulo() :String
123
Memento
Propsito
Motivacin
127
61
Memento
Aplicabilidad
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
128
Memento
Consecuencias
Mantiene el encapsulamiento
Simplifica la clase Creador ya que no debe preocuparse
de mantener las versiones del estado interno.
Podra incurrir en un considerable gasto de memoria:
encapsular y restaurar el estado no debe ser costoso.
Puede ser difcil en algunos lenguajes asegurar que slo
el Creador tenga acceso al estado del Memento.
Ing. Judith Meles
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
129
62
Memento
130
Memento : Aplicacin
Estructura
class Memento
entity
PreferenciaCliente
-
color :ColorPredefinido
favorito :LinkFavorito[]
+
+
+
+
+
+
entity
LinkFavorito
0..* -
-favorito
fechaHora :Date
marcador :String
url :String
getURL() :String
1
0..*
entity
ColorPredefinido
nombre :String
1
-preferencia
entity
Cliente
-
email :String
prefAnteriores :MementoPreferencia[]
preferencia :PreferenciaCliente
+
+
+
+
+
+
+
+
+
+
conocerPreferencia() :PreferenciaCliente
getEMail() :void
getFechaNacimiento() :Date
getPais() :Pais
getTelefono() :String
guardarPreferencia() :void
listarTarjetasNoVencidas() :void
mostrarPreferenciasActuales() :String[][]
recuperarPreferenciaAnterior() :void
setNuevaPreferencia(l :LinkFavorito[], c :ColorPredefinido) :void
memento
MementoPreferencia
1..*
color :ColorPredefinido
favorito :LinkFavorito[]
+
+
+
+
getColor() :ColorPredefinido
getLinkFavorito() :LinkFavorito[]
new()
setPreferencias(l :LinkFavorito[], c :ColorPredefinido) :void
control
GestorCliente
+
+
+
+
+
aplicarFormatoPais() :void
crearPedido() :void
formatearFechaNacimiento() :String
formatearTelefono() :String
guardarPedido() :void
131
63
Memento: Aplicacin
Participantes
Creador [PreferenciasCliente]: es quien va a crear y/o actualizar el Memento de
preferencias del cliente.
Memento [MementoPreferencia]: cada una de las instancias representa las
preferencias en cuanto a visualizacin, links, etc. que tuvo el cliente en un momento
determinado.
Guardin [Cliente]:Es quien contiene a todas las instancias de MementoPreferencia.
Cliente [GestorCliente]: Es quin solicita las preferencias actuales o anteriores del
cliente y tambin la creacin de las mismas.
Procedimiento
Definir cules de los atributos que conforman el estado de un objeto sern necesarios
restaurar en un momento posterior. Esos atributos constituirn los atributos del
MementoPreferencias.
El creador [PreferenciasCliente] es el responsable de la creacin de las instancias de
memento [MementoPreferencia], y contendr el estado actual de la preferencia de
cada cliente.
El guardin [Cliente] es el responsable de contener cada una de las instancias del
memento (MementoPreferencia).
Ing. Judith Meles
Dinmica:
Creacin
132
Memento : Aplicacin
sd Memento-Creacion
:GestorCliente
:Cliente
:PreferenciaCliente
setNuevaPreferencia(l :LinkFavorito[], c :
ColorPredefinido)
guardarPreferencia()
crearMemento(l :LinkFavorito[], c :
ColorPredefinido) :
MementoPreferencia
setLinkFavorito(l :LinkFavorito[])
new()
memento
:MementoPreferencia
setPreferencias(l :
LinkFavorito[], c :
ColorPredefinido)
setColor(c :ColorPredefinido)
133
64
Memento : Aplicacin
sd Memento-PreferenciasActuales
Dinmica:
Preferencias
Actuales
:GestorCliente
:Cliente
:PreferenciaCliente
mostrarPreferenciasActuales() :String[][]
getLinkFavorito() :LinkFavorito
getColor() :ColorPredefinido
134
Memento : Aplicacin
sd Memento-PreferenciasAnteriores
memento
:MementoPreferencia
:GestorCliente
:Cliente
:PreferenciaCliente
recuperarPreferenciaAnterior()
Dinmica:
Preferencias
Anteriores
establecerMemento(m :MementoPreferencia)
getColor() :ColorPredefinido
setColor(c :ColorPredefinido)
getLinkFavorito() :LinkFavorito
setLinkFavorito(l :LinkFavorito[])
135
65
Builder (Constructor)
Propsito
Separa la construccin de un objeto complejo de su
representacin, as que el mismo proceso de
construccin puede crear diferentes representaciones.
Motivacin
Un traductor de documentos RTF a otros formatos.
Es posible aadir una nueva conversin sin modificar
el traductor?
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
136
Builder
Herencia
Realizacin
137
66
Builder
Aplicabilidad
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
138
Builder
Consecuencias
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
139
67
Builder
Implementacin
Builder: Aplicacin
Estructura
class Builder
director
DirectorConstruccionCatalogo
-
140
constructor :ConstructorCatalogo
constructor
ConstructorCatalogoWeb
interface
ConstructorCatalogo
1
+
1 +
+
+
1
constructor
ConstructorCatalogoImpreso
control
GestorPublicacionCatalogo
+ publicarCatalogoResumen() :void
reporte :ImpresorCatalogo
+
+
+
+
constructor
ConstructorCatalogoResumenWeb
-
reporte :PantallaCatalogoResumenWeb
+
+
+
+
+
+
boundary
ImpresorCatalogo
+ imprimirArticulo(info :String[]) :void
+ imprimirSeccion(nom :String) :void
boundary
PantallaCatalogoResumenWeb
-
infoArticulos :String[][]
nombreSecciones :String[]
+
+
+
+
reporte :PantallaCatalogoWeb
+
+
+
+
1
boundary
PantallaCatalogoWeb
-
btnAplicarFiltro
btnSeleccionar
filtros
infoArticulos :String[][]
lblFechaVigente
listaSecciones :String[]
rutaImagen :String[]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
141
68
Builder: Aplicacin
Participantes
Constructor [ConstructorCatalogo]: especifica una interfaz abstracta para
crear las partes de un objeto complejo.
Constructor Concreto [ConstructorCatalogoWeb,
ConstructorCatalogoResumenWeb, ConstructorCatalogoImpreso ]:
implementa la interfaz Constructor para construir y ensamblar las partes del
objeto producto; define la representacin a crear.
Director [DirectorConstruccionCatalogo]: es el encargado de crear un
objeto usando la interfaz Constructor.
Producto [PantallaCatalogoWeb, PantallaCatalogoResumenWeb,
ImpresorCatalogo]: representa el objeto complejo que es construido.
142
Builder: Aplicacin
Procedimiento
Definir las diferentes partes que debern construirse para obtener el
objeto completo.
Especificar la interfaz Constructor que define los mtodos para
construir cada una de las partes detallada anteriormente.
Establecer la clase responsable de dirigir, coordinar y controlar la
construccin, clase Director.
Crear la o las clases que sern los constructores concretos de los
productos a ensamblar, las cuales implementan la interfaz
Constructor.
Ing. Judith Meles
143
69
sd Builder
Builder: Aplicacin
Dinmica:
:GestorPublicacionCatalogo
publicarCatalogoResumen()
constructor
ConstructorCatalogoResumenWeb
new()
new(con :ConstructorCatalogo)
director
:DirectorConstruccionCatalogo
El mtodo construirImagen(...) se
implementa vaco, ya que el producto
ResumenWeb no muestra la imagen del
artculo.
:PantallaCatalogoResumenWeb
construirSeccion(sec :String[])
*agregarSeccion(s :String)
construirArticulo(art :String[][])
*agregarArticulo(a :
String[][])
construirImagen(img :String[])
obtenerProducto() :PantallaCatalogoResumenWeb
publicar()
144
Motivacin
145
70
Abstract Factory
Estructura
Realizacin
146
Abstract Factory
Estructura
Herencia
Ing. Judith Meles
147
71
Abstract Factory
Aplicabilidad
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
148
Abstract Factory
Consecuencias
149
72
Abstract Factory
Implementacin
Factoras como singleton.
Se necesita una subclase de AbstractFactory por cada clase de
producto que redefine un mtodo factora.
Posibilidad de usar el patrn Prototype.
Definir factoras extensibles: AbstractFactory slo necesita un
mtodo de creacin. DEPENDE DEL LENGUAJE
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
150
151
73
Estructura
class AbstractFactory
entity
Cliente
control
GestorCliente
+
+
+
aplicarFormatoPais() :void
formatearFechaNacimiento() :String
formatearTelefono() :String
interface
IInfoPersonal
email :String
fechaNacimiento :Date
telefono :String
+
+
+
+
getEMail() :void
getFechaNacimiento() :Date
getPais() :Pais
listarTarjetasNoVencidas() :void
+
+
fabrica :IFabricaPais
nombe :String
+
+
getFabrica() :IFabricaPais
getNombre() :String
producto
InfoPersonalArg
-
producto
InfoPersonalChi
entity
Pais
-
formatoCodPostal :String
formatoTelefono :String
fabrica
FabricaChile
interface
ICalendario
1
interface
IFabricaPais
+
+
+
+
+
formatoCodPostal :String
formatoTelefono :String
producto
CalendarioChile
-
+
+
+
formatoFecha :String
formatoFechaLarga :String
formatoHora :String
separadorFecha :char
separadorHora :char
fabrica
FabricaArgentina
producto
CalendarioArg
-
formatoFecha :String
formatoFechaLarga :String
formatoHora :String
separadorFecha :char
separadorHora :char
152
Declara una interfaz para las operaciones que crean los objetos que determinar las
preferencias de los usuarios para moneda, fecha y hora.
Implementa las operaciones que crean los objetos que definen las preferencias
concretas de cada pas.
Cliente [GestorCliente]
Define un objeto para que sea creado por la fbrica correspondiente al pas.
Slo usa interfaces declaradas por las clases fbrica abstracta y producto
abstracto.
153
74
Dinmica
sd AbstractFactory
fabrica
:FabricaArgentina
:GestorCliente
:Cliente
producto
:CalendarioArg
producto
:InfoPersonalArg
:Pais
aplicarFormatoPais()
conocerPais() :Pais
getFrabrica() :IFabricaPais
formatearFechaNacimiento() :String
getFechaNacimiento() :Date
formatearFecha(d :Date) :String
formatearTelefono() :String
getTelefono() :String
formatearNroTelefono(t :String) :String
formatearNroTelefono(t :String) :String
154
155
75
<<sing leton>>
Num eroPedido
Ges torPedido
(f rom Analy sis Model)
Des pachadoParcial
Pedido
Es tado
1..*
Carrito
Des tino
Entregado
CarritoCom pleto
Form aEnvo
1..*
MedioTrans porte
(f rom Analy sis Model)
1..*
Des pachado
Cerrado
Cliente
0..*
Articulo
(from Analysis Model)
TipoArticulo
0..*
1..*
Provincia
Localidad
DetallePedido
Em presaTrans porte
(f rom Analy sis Model)
1..*
Pais
Catlogo
(f rom Analy sis Model)
DirectorCons truccionCatalogo
Lis ta
1
1..*
0..*
Seccion
(f rom Analy sis Model)
ConstructorCatalogo
IteradorArticulos
Iterador
PantallaCatalogoRes um enWeb
Im pres orCatalogo
Cons tructorCatalogoWeb
PantallaCatalogoWeb
158
159
76
Problema de Impedancia
Los tipos a ser usados en
las tablas son
mayormente los tipos
primitivos
La informacin se
almacena en los objetos.
Por lo tanto necesitamos
transformar nuestra
estructura de informacin
de objeto a una estructura
orientada a tablas
Crea un fuerte
acoplamiento entre la
aplicacin y el DBMS
Memoria Volatil
Memoria
Persistente
160
Objetos en Tablas
(1) Asignar una tabla para la clase.
(2) Cada atributo (primitivo) se transformar en una columna en la
tabla. Si el atributo es complejo (es decir, debe componerse de tipos
de DBMS), o agregamos una tabla adicional para el atributo, o
distribuimos el atributo en varias columnas de la tabla de la clase.
(3) La columna de la clave primaria ser el identificador nico de la
instancia, llamado identificador.
(4) Cada instancia de la clase ahora ser representada por una fila
en esta tabla.
(5) Cada asociacin de conocimiento con una cardinalidad mayor
que 1 (por ejemplo, [0..N]) se transformar en una nueva tabla.
Esta nueva tabla conectar las tablas que representan los objetos
que van a ser asociados.
Ing. Judith Meles
161
77
Objetos en Tablas
ECU
Valor de Depsito[1]
Nombre [1]
String
Item de
Depsito
Item de Depsito
Nombre
Lata33
Lata50
Botella25
Botella75
Entero
(a)
Valor de Depsito
0.25
0.35
0.30
0.50
Total Diario
142
35
173
78
(b)
162
Object
PersistentObjectAdministrador
ObjectState
PersistentState
RDBPort
hereda
Port
Item de Depsito
Item
PersistentItemAdministrador
ItemState
PersistentItemState
163
78
String
Entero
Item de
Depsito
hereda
hereda
Ancho [1]
Medidas
String
Medidas
Alto [1]
Lata
Botella
Medidas
String
Medidas
String
Medidas
String
164
Eliminar la Herencia
Nombre Lata
Valor de Depsito
Total Diario
Alto
Ancho
Lata33
0.25
127
17
7.50
Lata50
0.35
283
25
7.50
Nombre Botella
Valor de Depsito
Total Diario
Alto
Ancho Inferior
Botella25
0.30
173
23
Botella75
0.50
78
32
165
79
Simular la Herencia
Nombre Lata
Valor de Depsito
Total Diario
Lata33
0.25
142
Lata50
0.35
35
Botella25
0.30
173
Botella75
0.50
78
Lata
Nombre Lata Alto
Ancho
Lata33
17
7.50
Lata50
25
7.50
Botella
Nombre Botella
Botella25
Botella75
Alto
23
32
2
3
166
167
80
Frameworks
Es un conjunto extensible de clases e interfaces que colaboran para
proporcionar servicios de la parte central e invariable de un subsistema lgico.
Contiene clases concretas y (especialmente) abstractas que definen las
interfaces a las que ajustarse, interacciones de objetos en las que participar, y
otras variantes.
Puede requerir que el usuario del framework defina subclases de las clases del
framework para utilizar, adaptar y extender los servicios del framework.
Tiene clases abstractas que podran contener tanto mtodos abstractos como
concretos.
Confa en el Principio de Hollywood: No nos llame, nosotros lo llamaremos.
Ofrecen un alto grado de reutilizacin, mucho ms que con clases individuales.
169
Framework de Persistencia
Debera proporcionar funciones para:
Almacenar y recuperar objetos en un
mecanismo de almacenamiento persistente.
Confirmar y deshacer (commit y rollback) las
transacciones
170
81
Framework de Persistencia
dd Deployment Model
Ventana
CoordinadorDeAplicaciones
Dominio
EsquemaPersistenciaRelacionalObj etos
Base de Datos
Relacional
Ing. Judith Meles
171
Ideas a desarrollar
Correspondencia (Mapping): entre clases y tablas; entre atributos y campos. Es decir
correspondencia de esquemas.
Identidad de Objeto: identificador nico que vincula objetos con registros.
172
82
173
Clave
Primaria
OID
Nombre
ciudad
xyz123
Fruta Fresca
Salta
abc345
Expofrut
San Carlos
174
83
175
La Fachada de Persistencia
:
AdaptadorBDProductos
:
FachadaDePersistencia
obj:= get(...)
176
84
Responsabilidad de Materializar y
Desmaterializar Objetos
La fachada no hace el trabajo, solo lo delega en objetos del subsistema.
El patrn Experto, sugiere que la propia clase de dominio
(EspecificacionDelProducto) es candidata porque tiene los datos que se
van a almacenar. Esto se denomina correspondencia directa.
Se puede utilizar la correspondencia directa si el cdigo relacionado a la
BD se genera y se inyecta automticamente mediante un compilador de
post-procesamiento, y el desarrollador nunca tiene que ver o mantener
ese cdigo que aade confusin a la clase provocando:
177
178
85
179
Bridge / Handle
Propsito
Desacoplar una abstraccin de su implementacin, de modo que los
dos puedan cambiar independientemente.
Motivacin
Clase que modela la abstraccin con subclases que la implementan
de distintos modos.
Herencia hace difcil reutilizar abstracciones e implementaciones de
forma independiente
Si refinamos la abstraccin en una nueva subclase, est tendr
tantas subclases como tena su superclase.
El cdigo cliente es dependiente de la plataforma.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
180
86
Bridge / Handle
Estructura
Herencia
Estructura
Cliente
181
Bridge / Handle
Realizacin
Abstraccion
imp
Implementador
operacion()
operacionImp()
imp->operacionImp();
ImpConcretoA
AbstraccionRefinada
operacionImp()
ImpConcretoB
operacionImp()
182
87
Bridge
Aplicabilidad
183
Bridge
Consecuencias
184
88
Bridge
Implementacin
Estructura
185
Bridge : Aplicacin
class Bridge
control
GestorCliente
+
+
crearPedido() : void
guardarPedido() : void
abstraccion
IntermediarioBD
+
abstraccion
IntermediarioBDArticulo
abstraccion
IntermediarioBDPedido
entity
Pedido
+
interface
ImpIntermediarioBD
+
+
+
implementador
ImpIntermediarioBDOO
implementador
ImpIntermediarioBDR
186
89
Bridge : Aplicacin
Participantes
Abstraccin [IntermediarioBD]:
Define la Interfaz de la abstraccin, manteniendo referencia al
objeto implementador
Abstraccin Refinada [IntermediarioBDProd;
IntermediarioBDPedido]:
extiende la interfaz definida por la Abstraccin
Implementador [ImpIntermediarioBD]:
Define la interfaz de las clases de implementacion.
Implementador Concreto [ImpIntermediarioBDOO,
ImpIntermediarioBDR]:
Implementa la interfaz implementador y define su implementacin
concreta
Ing. Judith Meles
187
Bridge : Aplicacin
Procedimiento
El GestorPedido debe actualizar el estado del objeto.
Para ello, pide colaboracin al
IntermediarioBDPedido para que se encargue de
guardarlo en la base de datos.
IntermediarioBDPedido, a su vez, debe resolver el
guardado en funcin a la tecnologa de BD
correspondiente, por lo que pide colaboracin a
ImpIntermediarioBDR , quien se encarga de resolver
las operaciones necesarias para actualizar el objeto en
la base de datos
Ing. Judith Meles
188
90
Dinmica
Bridge : Aplicacin
sd Bridge
abstraccion
:IntermediarioBDPedido
implementador
:ImpIntermediarioBDR
:GestorCliente
crearPedido()
new(nro :int)
:Pedido
guardarPedido()
valorObjeto(objeto :Object)
existeOID(id :String) :boolean
dematerializeWith(obj :Object)
189
Template Method
Propsito
Define el esqueleto (esquema, patrn) de un algoritmo en
una operacin, difiriendo algunos pasos a las subclases.
Permite a las subclases redefinir ciertos pasos de un
algoritmo sin cambiar la estructura del algoritmo.
Motivacin
Fundamental para escribir cdigo en un framework.
Clase Aplicacin que maneja objetos de la clase
Documento: mtodo OpenDocument
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
190
91
191
192
92
193
194
93
195
Framework de Persistencia
Pers is tencia
196
94
197
Sentencias SQL
Sentencias SQL en distintas clases conversores no es terrible,
pero se puede mejorar
En lugar de eso:
198
95
Estados Transaccionales
Los objetos persistentes pueden insertarse,
eliminarse o modificarse.
Operar sobre un objeto persistente no provoca una
actualizacin inmediata sobre la BD, ms bien se
debe ejecutar una operacin commit explcita.
Adems considerar que la respuesta a una operacin
depende del estado de las transaccin del objeto.
Ing. Judith Meles
199
new[ no desde la BD ]
Nuevo
commint/insert
commit /actualizar
ViejoLimpio
ViejoSucio
rollback/ re-cargar
eliminar
Nota:
Nuevo: recin creado, no est en la BD
Viejo: recuparado de la BD
Limpio: sin modificar
Sucio: modificado
eliminar
ViejoAEliminar
rollback / recargar
Eliminado
commit /eliminar
200
96
State
201
Objetos Persistentes
La situacin genrica de diseo responde a
esta estructura:
Dominio
Persistencia
ObjetoPersistente
oid : OID
marcaDeTiempo : FechaHora
EspecificacionDelProducto
commit()
rollback()
eliminar()
guardar()
202
97
203
ObjetoPersistente
oid : OID
marcaDeTiempo : FechaHora
EstadoObjetoP
commit()
rollback()
eliminar()
guardar()
EspecificacionDelProducto
fabricante : IFabricante
getDireccionFabricante()
Venta
..........
..........()
{
// por defecto
// cuerpos vacos para
// cada mtodo
}
commit(obj : ObjetoPersistente)
1 rollback(obj : ObjetoPersistente)
eliminar(obj : ObjetoPersistente)
guardar(obj : ObjetoPersistente)
EstadoViejoSucio
EstadoViejoLimpio
commit()
rollback()
eliminar()
eliminar()
guardar()
EstadoViejoAEliminar
EstadoNuevo
commit()
commit()
rollback()
{ // commit
FachadaDePersistencia.getInstancia().actualizar (obj)
obj.setEstado(EstadoViejoLimpio.getInstancia() )}
{ // rollback
FachadaDePersistencia.getInstancia().recargar (obj)
obj.setEstado(EstadoViejoLimpio.getInstancia() )}
{ // eliminar
obj.setEstado(EstadoViejoAEliminar.getInstancia() )}
{ // guardar
obj.setEstado(EstadoViejoSucio.getInstancia() )}
{ // commit
FachadaDePersistencia.getInstancia().insertar (obj)
obj.setEstado(EstadoViejoLimpio.getInstancia() )}
{ // commit
FachadaDePersistencia.getInstancia().eliminar (obj)
obj.setEstado(EstadoViejoAEliminar.getInstancia() )}
204
98
205
Command
Propsito
Motivacin
206
99
Command
Estructura
Cliente
Herencia
Orden
Invocador
ejecutar()
Receptor
accin()
+receptor
OrdenConcreta
estado
ejecutar:
receptor.accin()
ejecutar()
207
Estructura
Command
Realizacin
IOrden
Invocador
Cliente
ejecutar()
Receptor
accin()
ejecutar:
receptor.accin()
+receptor
OrdenConcreta
estado
ejecutar()
208
100
Colaboracin
r : Receptor
Command
Crea comando indicando receptor
: Cliente
co : Command
: Invocador
1. Command (r)
2. registrarCommand(co)
3. ejecutar()
3.1. accion()
}
}
inicializacin
uso
209
Command
Aplicabilidad
Parametrizar objetos por la accin a realizar (en lenguajes
procedurales con funciones Callback: funcin que es registrada
en el sistema para ser llamada ms tarde
Especificar, encolar y ejecutar mensajes en diferentes instantes:
un objeto Command tiene un tiempo de vida independiente de la
solicitud original.
Soportar facilidad undo/redo: la operacin execute puede guardar
informacin para revertir su efecto.
Recuperacin de fallos.
Modelar transacciones va conjunto de comandos
Ing. Judith Meles
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
210
101
Command
Consecuencias
Desacopla el objeto que invoca la operacin del objeto que
sabe cmo realizarla.
Cada subclase CommandConcreto especifica un par
receptor/accion, almacenando el receptor como un atributo e
implementando el mtodo ejecutar.
Objetos command pueden ser manipulados como cualquier
otro objeto.
Se pueden crear command compuestos (aplicando el patrn
Composite).
Es fcil aadir nuevos commands.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
211
Command : Aplicacin
Estructura
212
102
Command : Aplicacin
Participantes
Orden [OrdenDB]: Declara una interfaz para ejecutar una accin.
OrdenConcreta [RegistrarPedido, ModificarPedido]: Define un
enlace para que el objeto Receptor realice una accin.
Cliente [GestorPedido]: Crea un objeto OrdenConcreta y le indica el
Receptor correspondiente.
Invocador [Pedido]: Solicita a la orden que ejecute una operacin.
Receptor [IntermediarioBD, IntermediarioBDRelacional,
IntermediarioBDOObjetos]: Sabe cuando realizar las operaciones
asociadas a una peticin.
213
Command : Aplicacin
Procedimiento
103
Dinmica
Command : Aplicacin
: GestorPedido
: Pedido
:
RegistrarPedido
:
IntermediarioBDRelacional
crearPedido( )
new( )
crearIntermediario( )
new( )
crearRegistrarPedido( )
new(intermediarioBDRelacional : IntermediarioBD)
armarEstadoPedido(comando : OrdenBD)
ejecutar(p : Pedido)
registrarClienteDePedido(cli : Cliente)
registrarFormaEnvio(fe : FormaEnvio)
registrarMedioTransporte(mt : MedioTransporte)
* registrarArtculos(articulos : Articulos[])
guardar(script : String[])
215
Command : Aplicacin
Ventajas
216
104
Command : Aplicacin
Estructura
class Command
control
GestorPedido
entity
Pedido
+
+
+
+
crearIntermediario() : IntermediarioBD
crearPedido() : void
crearRegistrarPedido() : void
comando
ModificarPedido
abstraccion
IntermediarioBD
interface
OrdenBD
+
comando
RegistrarPedido
abstraccion
IntermediarioBDPedido
+
new() : void
interface
ImpIntermediarioBD
+
+
+
217
Command : Aplicacin
Participantes
Orden [OrdenDB]: Declara una interfaz para ejecutar una accin.
OrdenConcreta [RegistrarPedido, ModificarPedido]: Define un
enlace para que el objeto Receptor realice una accin.
Cliente [GestorPedido]: Crea un objeto OrdenConcreta y le indica el
Receptor correspondiente.
Invocador [Pedido]: Solicita a la orden que ejecute una operacin.
Receptor [IntermediarioBD, IntermediarioBDPedido]: Delega las
operaciones asociadas a una peticin a los implementadores.
Ejecutor: [ImpIntermediarioBD, ImpIntermediarioBDR]: Resuelve la
peticin de guardar el pedido en la base de datos correspondiente,
en este caso BDR.
Ing. Judith Meles
218
105
Command : Aplicacin
Procedimiento
219
Command : Aplicacin
Dinmica
sd Command
:GestorPedido
crearPedido()
new(nro :int)
:Pedido
crearIntermediario() :IntermediarioBD
implementador
:ImpIntermediarioBDR
new()
crearRegistrarPedido()
new(interm :IntermediarioBD)
comando
:RegistrarPedido
armarEstadoPedido(comando :OrdenBD)
ejecutar(obj :Object)
new()
abstraccion
IntermediarioBDPedido
registrarClienteDePedido(cli :Cliente)
registrarFormaEnvio(fe :FormaEnvio)
registrarMedioTransporte(mt :MedioTransporte)
registrarDetallePedido(detalle :DetallePedido[])
valorObjeto(objeto :Object)
dematerializeWith(obj :Object)
220
106
commit()
{
ordenar()
for each ICOmmand cmd
cmd.ejecutar()
}
Transaccion
commands : List
1..*
commit()
aadirEliminar(obj : ObjetoPersistente)
aadirInsertar(obj : ObjetoPersistente)
aadirActualizar(obj : ObjetoPersistente)
ordenar()
ordenar()
utiliza objetos EstrategiaOrdenacion para
permitir diferentes algoritmos de
ordenacin al ordenar los objetos
Command
CommandActualizarDB
ejecutar()
ICommand
ejecutar()
deshacer()
ObjetoPersistente
CommandDB
objeto : ObjetoPersistente
ejecutar()
deshacer()
CommandInsertarDB
ejecutar()
commit()
1 rollback()
eliminar()
guardar()
CommandEliminarDB
ejecutar()
221
222
107
Proxy
Propsito
Proporcionar un sustituto (surrogate) de un objeto para
controlar el acceso a dicho objeto.
Motivacin
Diferir el costo de crear un objeto hasta que sea necesario
usarlo: creacin bajo demanda.
Un editor de documentos que incluyen objetos grficos.
Cmo ocultamos que una imagen se crear cuando se
necesite?: manejar el documento requiere conocer informacin
sobre la imagen.
Ing. Judith Meles
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
223
Proxy
Estructura
224
108
Proxy
Aplicabilidad
Siempre que hay necesidad de referenciar a un objeto mediante
una referencia ms rica que una referencia normal.
Situaciones comunes;
1) Proxy acceso remoto (acceso a un objeto en otro espacio de
direcciones)
2) Proxy virtual (crea objetos grandes sobre demanda)
3) Proxy para proteccin (controlar acceso a un objeto)
4) Referencia inteligente (smart reference), por ejemplo un
decorador, contar cantidad de referencias, etc.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
225
Proxy
Consecuencias
Introduce un nivel de indireccin para:
1) Un proxy remoto oculta el hecho que objetos residen en diferentes
espacios de direcciones.
2) Un proxy virtual tales como crear o copiar un objeto bajo demanda.
3) Un proxy para proteccin o las referencias inteligentes permiten
realizar tareas de control sobre los objetos accedidos.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
226
109
227
228
110
}
Ing. Judith Meles
229
}
Ing. Judith Meles
230
111
Mem ento
Builder
Proxy
Iterator
Bridge
definir recorridos
Com m and
definir la cadena
Flyweight
Mediator
Strategy
Obs erver
definir los pas os de un algoritm o
Tem plate Method
Prototype
s uele us ar
Fa ctory M ethod
231
Dependencia de plataformas Hw o Sw
Dependencias de algoritmos
232
112
Bibliografa
Design Patterns: Elements of Reusable Objectoriented software. Gamma, Helm, Johnson,
Vlissides
Applying UML and Patterns. Craig Larman
Head First Design Patterns. Freeman & Freeman
233
113