Sie sind auf Seite 1von 113

Universidad Tecnolgica Nacional

Facultad Regional Crdoba


Ctedra de Diseo de Sistemas

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

Ing. Judith Meles

Patrones vs. Idiomas


Cul es la diferencia entre un patrn de diseo y un
idioma?

La diferencia es el alcance.
En general, tanto los patrones de diseo como los idiomas
describen soluciones a problemas de diseo recurrentes.

En el patrn de diseo, tanto el problema como la solucin


son lo suficientemente genricos como para ser
independientes del lenguaje de programacin.
Un idioma, por el contrario, es un patrn de bajo nivel que es
especfico a un lenguaje de programacin.

Ing. Judith Meles

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.

Nominar un patrn incrementa los vocabularios de


diseo
Nos permite disear con abstraccin de un nivel
ms alto

Ing. Judith Meles

El problema
Describe cuando se puede aplicar el patrn. Explica
el problema y su contexto.

Puede ser problemas especficos tales como representar los


algoritmos con objetos
Puede describir clases o estructuras de objetos que son
sintomticos de un diseo flexible
Puede incluir una lista de condiciones que se tienen que
satisfacer antes de aplicar el patrn

Ing. Judith Meles

La Solucin
Describe los elementos que forman el diseo, sus
relaciones, responsabilidades, y cooperaciones.

La solucin no describe ningn diseo concreto


Un patrn es una plantilla para muchas situaciones
diferentes
Un patrn dispone la descripcin abstracta de un problema
de diseo y cmo se resuelve con elementos (clases y
objetos) generales

Ing. Judith Meles

Las consecuencias
Los buenos resultados e inconveniencia de
aplicar el patrn.

Ing. Judith Meles

Son crticas para evaluar el patrn y entender los costos y


beneficios de aplicar el patrn.
Suele relacionar con el equilibrio entre el espacio y el tiempo
Puede tratar asuntos de lenguajes e implementaciones
Para el diseo orientado a objetos particularmente:
flexibilidad, extensibilidad y portabilidad

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.

Ing. Judith Meles

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

Cmo alcanza el patrn sus objetivos?, Cules son los compromisos


y resultados de usar el patrn?, Alternativas, Costes y Beneficios

Implementacin

Tcnicas, heursticas y consejos para la implementacin


Hay cuestiones dependientes del lenguaje?

Ejemplo de Cdigo
Usos conocidos
Patrones relacionados
Ing. Judith Meles

11

Cmo seleccionar un patrn?


Considera de que forma los patrones
resuelven problemas de diseo
Lee la seccin que describe el propsito de
cada patrn
Estudia las interrelaciones entre patrones
Analiza patrones con el mismo propsito
Examina las causas de redisear
Considera que debera ser variable en tu
diseo
Ing. Judith Meles

12

Cmo usar un patrn?


Lee el patrn, todos sus apartados.
Obtenga una visin global.
Estudia la Estructura, Participantes y Colaboraciones
Mira el ejemplo de cdigo
Asocia a cada participante del patrn un elemento
software de tu aplicacin.
Implementa las clases y mtodos
relacionados con el patrn.
Ing. Judith Meles

13

A qu ayudan los patrones?


Encontrar los objetos

Ing. Judith Meles

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

A qu ayudan los patrones?


Determinar granularidad de los objetos

Facade, Flyweight, Builder, Visitor,..

Especificar interfaces

Memento, Decorator, Proxy,..

Especificar implementacin de clases

Muchos patrones dependen de la distincin entre


herencia de implementacin y herencia de interfaces
Observer, State, Chain of Responsability,

Ing. Judith Meles

15

A qu ayudan los patrones?


Especificar implementacin de clases
programar hacia la interfaz, no hacia la implementacin

No declarar variables de clases concretas sino abstractas.


Patrones de creacin permiten que un sistema est basado en
trminos de interfaces y no en implementaciones.
Favorecer la reutilizacin
Delegacin

Ing. Judith Meles

16

A qu ayudan los patrones?


Favorecer la reutilizacin
Favorecer la composicin sobre la herencia de
clases

Herencia y composicin trabajan juntas


Se suele abusar de la herencia. Los diseos
suelen ser ms reutilizables si dependen de la
composicin.
Ing. Judith Meles

17

A qu ayudan los patrones?


La clave para la reutilizacin es anticiparse a los
nuevos requisitos y cambios, de modo que los
sistemas evolucionen de forma adecuada.
Cada patrn permite que algunos aspectos de la
estructura del sistema puedan cambiar
independientemente de otros aspectos.
Facilitan reuso interno, extensibilidad y mantenimiento.

Ing. Judith Meles

18

Tipos de patrones de diseo


(Gamma)
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

19

Clasificacin
Creacin
mbito Clase
Objeto

Factory Method
Abstract Factory
Builder
Prototype
Singleton

Propsito
Estructural
Adapter
Adapter
Bridge
Composite
Decorator

Facade
Flyweight

Proxy

Ing. Judith Meles

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

Ing. Judith Meles

21

Patrones de Creacin
Se encapsula:

qu clases concretas usa el sistema


cmo se crean las instancias de esas clases

El sistema conoce las clases abstractas


Flexibilidad en qu se crea, quin lo crea, cmo se crea
y cundo se crea.

Ing. Judith Meles

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.

Ing. Judith Meles

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

Ing. Judith Meles

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,

proporcionando una alternativa flexible a la herencia para extender funcionalidad.


Faade (Fachada): Proporciona una interfaz unificada para un conjunto de interfaces de un
subsistema. Define una interfaz de alto nivel que hace que el subsistema sea ms fcil de
utilizar.
Flyweight (Peso Ligero): Usa el comportamiento para permitir un gran nmero de

objetos de granularidad fina de forma eficiente.


Proxy (Apoderado): Proporciona un sustituto o representante de otro objeto para controlar el
acceso a ste.
Ing. Judith Meles

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

Ing. Judith Meles

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

peticin a su receptor, al dar a ms de un objeto la posibilidad de responder a la


peticin. Crea una cadena con los objetos receptores y pasa la peticin a travs de la
cadena hasta que sta sea tratada por algn objeto.
Command (Orden): Encapsula una peticin en un objeto, permitiendo as parametrizar a los
clientes con distintas peticiones, encolar o llevar un registro de las peticiones y poder deshacer
las operaciones.
Interpreter (Intrprete): Define para un lenguaje dado, una representacin de su

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.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

27

Patrones de Comportamiento (cont.)


Memento (Recuerdo): Representa y externaliza el estado interno de un objeto sin violar el
encapsulamiento, de forma que ste puede volver a dicho estado ms tarde.
Observer (Observador): Define una dependencia de uno a muchos entre objetos, de forma que
cuando un objeto cambie de estado se notifica y se actualizan automticamente todos los
objetos que dependen de l.
State (Estado): Permite que un objeto modifique su comportamiento cada vez que cambie su
estado interno. Parecer que cambia la clase del objeto.
Strategy (Estrategia): Define una familia de algoritmos, encapsula cada uno de ellos y los hace
intercambiables. Permite que un algoritmo vare independientemente de los clientes que lo
usan.
Template Method (Mtodo Plantilla): Define en una operacin el esqueleto de algn algoritmo,
delegando en las subclases algunos de sus pasos. Permite que las subclases redefinan
ciertos pasos del algoritmo sin cambiar su estructura.
Visitor (Visitante): Representa una operacin sobre los elementos de una estructura de
objetos. Permite definir una nueva operacin sin cambiar las clases de los elementos sobre
los que opera.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento
Ing. Judith Meles

28

14

Modelo de Dominio

class Domain Model

(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

Ing. Judith Meles

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.

Hay muchas circunstancias en las cuales es necesario esto:

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.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

30

15

Singleton
Estructura

Ing. Judith Meles

31

Singleton
Aplicabilidad

Debe existir una nica instancia de una clase, accesible


globalmente.

Consecuencias

Acceso controlado a la nica instancia


Evita usar variables globales
Generalizar a un nmero variable de instancias
Manejar subclases de clase Singleton

Ing. Judith Meles

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.

Ing. Judith Meles

33

Singleton: Aplicacin
Participantes

Singleton [NumeroPedido]: proporciona un constructor privado, mantiene una referencia


esttica a la nica instancia de la clase, y proporciona un mtodo esttico de acceso getInstancia()- para devolver una referencia a la misma, permitiendo que los clientes
accedan a la nica instancia de la clase.
Procedimiento

Cuando necesitemos crear un nuevo pedido y por lo tanto asignarle su correspondiente


nmero, el gestor de pedido le pedira al Singleton (NumeroPedido), el nmero de pedido que
debe asignar al nuevo pedido.

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.

Ing. Judith Meles

34

17

Singleton:
Aplicacin

sd Singleton
singleton
:NumeroPedido
:GestorPedido

Dinmica

crearPedido()
calcularNumeroPedido() :int

Se crea la instancia del


Singleton -si an no existe.

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

Como ya existe la instancia


nica del Singleton NO se
crea la misma.

Ing. Judith Meles

35

State (Estado)
Propsito

Permite a un objeto cambiar su comportamiento cuando cambia su


estado. El objeto parece cambiar de clase.

Motivacin

Una conexin TCP puede encontrarse en uno de varios estados, y


dependiendo del estado responder de un modo diferente a los
mensajes de otros objetos para solicitudes tales como abrir, cerrar o
establecer conexin.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

36

18

State

Ing. Judith Meles

37

State
Aplicabilidad

Ing. Judith Meles

El comportamiento del objeto depende de su estado, y


debe cambiar su comportamiento en tiempo de
ejecucin dependiendo de su estado.
Las operaciones tienen grandes estructuras CASE que
dependen del estado del objeto, que es representado
por uno o ms constantes de tipo enumerado.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

38

19

State
Consecuencias

Coloca todo el comportamiento asociado a un


estado particular en una clase.
Subclases vs. Sentencias CASE.
Ayuda a evitar estados inconsistentes
Transiciones de estado son ms explcitas.
Incrementa el nmero de objetos

Posible solucin: Los objetos ESTADO pueden ser


compartidos.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

39

State : Aplicacin

Estructura

class State
entity
Pedido

state
Preparado

entity
EstadoPedido

numero: int
detalle: DetallePedido[]
estado: EstadoPedido

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

agregarArticulo(art :ArticuloEspecifico, cant :int, precio :double)


confirmarPedido() : void
setEstado(nuevo :EstadoPedido) : void
preparar()
finalizarPreparacion()
cancelar()
retornar()
entregar()
devolver()
finalizar()
despachar()
enviarAPuntoDistribucion()
repartir()
iniciarReparto()
deshacerPreparacion()

+
+
+
+
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(a :Articulo, c :int, p :double, est :EstadoPedido)


preparar()
finalizarPreparacion()
despachar()
entregar()
finalizar()
devolver()
cancelar()
deshacerPreparacion()
cancelarPreparacion()
cancelarDespacho()

Ing. Judith Meles

new()

Para facilitar la comprensin


se suprimieron algunos
Estados de DetallePedido.

state
Finalizado
+

new()
cancelar() : Cancelado
preparar() : EnPreparacion
deshacerPreparacion() : Confirmado

agregarArticulo(art :ArticuloEspecifico, c :int, precio :double) : DetallePedido


crearDetalle(a :ArticuloEspecifico, c :int, p :double, est :EstadoPedido) : DetallePedido
cancelar() : Cancelado
confirmarPedido() : 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

Criterio de diseo asumido:


En la clase EstadoPedido todos los
mtodos se implementan con un
comportamiento bsico por defecto.
Las respuestas estndares son.
-Los mtodos con retorno "boolean"
devuelven "false".
-Los mtodos con retorno "clase de
Estado" devuelven NULL.

40

20

State: Aplicacin
Participantes

Contexto [Pedido]: recibe el mtodo para agregar un producto al pedido.


Estado Abstracto [EstadoPedido]: define los mtodos abstractos para cada
estado diferente.
Estados Concretos [EnCarroDeCompras; PendienteDePreparacin;
Confirmado; Cerrado; Despachado]: resuelven la peticin del mtodo en
funcin del estado concreto que poseen.

Procedimiento

El GestorPedido le pide al Pedido, que agregue un producto a la lista de


los productos que contiene el pedido.
El Pedido delega la peticin, en funcin de su estado actual a la instancia
de estado concreto que corresponda: EnCarroDeCompras.
La Instancia de EstadoConcreto que corresponda resuelve la peticin.

Ing. Judith Meles

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:

Se eliminan las sentencias CASE utilizando Polimorfismo.


Permite crecimiento en la variacin de la lgica de negocio en funcin de los cambios de estado.

Ing. Judith Meles

42

21

Strategy/Policy (Estrategia)
Propsito

Define una familia de algoritmos, encapsula cada uno, y


permite intercambiarlos. Permite variar los algoritmos de forma
independiente a los clientes que los usan

Motivacin

Existen muchos algoritmos para justificacin de texto, debe


implementarlo el cliente que lo necesita?

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

43

Strategy
Estructura

Herencia

Ing. Judith Meles

44

22

Strategy
Estructura

Realizacin

Ing. Judith Meles

45

Strategy
Aplicabilidad

Ing. Judith Meles

Configurar una clase con uno de varios


comportamientos posibles.
Se necesitan diferentes variantes de un algoritmo.
Una clase define muchos comportamientos que
aparecen como sentencias CASE en sus mtodos.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

46

23

Strategy
Consecuencias

Define una familia de algoritmos relacionados.


Una alternativa a crear subclases de la clase Contexto.
Elimina sentencias CASE
El cliente puede elegir entre diferentes estrategias o
implementaciones: debe conocer detalles
Se incrementa el nmero de objetos:

Solucin: usar Flyweight

State y Strategy son similares, cambia el Propsito


Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

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

+ cerrarSesion(sesiones :SesionUsuario[]) : void


1..* + estaActiva() : boolean

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.

Estrategia Concreta [CierrePorTiempoInactividad y CierrePorLimiteTransacciones]:


Implementan la variante del algoritmo de la operacin definida en la interfaz estrategia:
cerrarSesion().

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.

Ing. Judith Meles

49

Strategy: Aplicacin
Procedimiento

Ing. Judith Meles

Identificar el mtodo cuyo algoritmo posee diferentes variantes o


implementaciones [cerrarSesion()].
Definir la interfaz Estrategia Abstracta IEstrategiaCierreSesion
que define la interfaz comn para las variantes.
Establecer en el Contexto [GestorAdministradorSesin] la
referencia hacia la Estrategia Abstracta.
Definir como se configurar el Contexto con la/s estrategia/s
deseada/s.
Reconocer las diferentes variantes del algoritmo e implementar las
clases EstrategiaConcreta para cada comportamiento especfico.

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[])

El Contexto para cada sesin de usuario en


memoria verifica si caduc ejecutando el mtodo
variable de la Estrategia Concreta
(CierrePorTiempoInactividad) y, si es as, la cierra.

loop sesiones abiertas


haCaducado() :boolean
:true
cerrar()

Ing. Judith Meles

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

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

Ing. Judith Meles

Estructura

Ing. Judith Meles

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

Ing. Judith Meles

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.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

56

28

Template Method
Implementacin

Minimizar el nmero de mtodos que es necesario


redefinir en las subclases.
Nombrar a los mtodos que se deben redefinir
aadindole cierto prefijo, p.e. do.
En C++, mtodos a redefinir son protegidos y virtuales, el
mtodo plantilla no ser virtual.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

57

class Template Method

Template
Method:
Aplicacin

control
GestorCatalogo
+

conocerArticulo(art :Articulo) : String[]

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

Ing. Judith Meles

El Template Method (mtodo plantilla)


es el mtodo "mostrarInfoProducto()".
Los mtodos "mostrarInfoEspecfica()" y
"conocerTraducciones()" son los
mtodos abstractos variables que cada
subclase concreta implementar de
manera diferente.
Los mtodos "getTitulo()",
"conocerProductora()" y
"conocerIdiomaOriginal()" son los
mtodos de enganche (hook).

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


Participantes

Clase abstracta [Articulo]:

implementa un mtodo plantilla [mostrarInfoProducto()] que define el


esqueleto de un algoritmo, que llama a las operaciones primitivas y a las
definidas por la clase abstracta o a la de otros objetos
define las operaciones primitivas abstractas que son definidas por las
subclases para implementar los pasos de un algoritmo
[conocerTraducciones(),mostrarInfoEspecfica(), etc.]
Define los mtodos de enganche con la implementacin trivial que
usarn las clases concretas si lo deciden: getTitulo(),
conocerProductora(), conocerIdiomaOriginal().

Clases Concretas [Pelicula, Musica, Libro y Juego]:


implementan la operaciones primitivas para realizar los pasos del algoritmo
especifico de las subclases (mostrarInfoEspecifica(),
mostrarTraducciones(), etc.)

Ing. Judith Meles

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

Ing. Judith Meles

60

30

Template Method: Aplicacin


Procedimiento

Articulo necesita definir un mtodo que permita mostrar toda la informacin


de cada artculo, de modo de hacerlo lo ms independiente posible de las
clases que lo heredan
Para eso define el mtodo plantilla mostrarInfoProducto() que contiene la
estructura de lo que debe hacerse al momento de mostrar la informacin de
un articulo concreto; y define, adems las operaciones necesarias para
poder ejecutar el mtodo. Estas operaciones pueden ser :
Concretas de la clase abstracta: conocerIdiomaOriginal()
Operaciones primitivas: mostrarTraducciones(), mostrarInfoEspecfica()
Operaciones enganche: : getTitulo(), conocerProductora(),
conocerIdiomaOriginal().
En las subclases se definen las operaciones concretas para cada una de

ellas, y se sobreescriben las heredadas (mostrarInfoEspecifica(),


mostrarTraducciones())
Ing. Judith Meles

61

Factory Method
Propsito

Define un interfaz para crear un objeto, pero permite a las


subclases decidir la clase a instanciar: instanciacin diferida
a las subclases.

Motivacin

Ing. Judith Meles

Una clase C cliente de una clase abstracta A necesita crear


instancias de subclases de A que no conoce.
En un framework para aplicaciones que pueden presentar al
usuario documentos de distinto tipo: Clases Aplicacin y
Documento.
Se conoce cundo crear un documento, no se conoce de
Patrones de Creacin
qu tipo.
Patrones de Estructura
Patrones de Comportamiento

62

31

Factory Method

Estructura

Creador
metodoDeFabricacion()
unaOperacion()

Producto

ProductoConcreto

<<crea>>

CreadorConcreto

...
producto = metodoDeFabricacion()
...

return new ProductoConcreto()

metodoDeFabricacion()

Herencia
Ing. Judith Meles

63

Estructura

Factory Method

class 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

Ing. Judith Meles

65

Factory Method
Consecuencias

Ing. Judith Meles

Evita ligar un cdigo a clases especficas de la aplicacin.


Puede suceder que las subclases de Creador slo se crean
con el fin de la creacin de objetos.
Mayor flexibilidad en la creacin: subclases ofreciendo
versiones extendidas de un objeto.
El mtodo factora puede ser invocado por un cliente, no slo
por la clase Creador: jerarquas paralelas
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

66

33

Factory Method
Implementacin

Dos posibilidades

Creador es una clase abstracta con un mtodo factora abstracto.


Creador es una clase concreta que ofrece una implementacin por
defecto del mtodo factora.

El mtodo factora puede tener un parmetro que identifica a la


clase del objeto a crear.
Se evita crear subclases de Creador con:

Metaclases (Smalltalk y Java)


Genericidad (C++)
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

67

Factory Method : Aplicacin


Estructura

class Factory Method


entity
Articulo

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

Ing. Judith Meles

68

34

Factory Method : Aplicacin


Participantes

Producto [Articulo]:

Declara una interfaz de los objetos que crea el mtodo de Fabricacin.

ProductoConcreto [Libro, JuegoVideo, Pelicula, Musica]:

Creador [IGestorArticulo]:

Implementa las operaciones declaradas en la interfaz de producto.


Declara el mtodo de fabricacin, el cual devuelve un objeto de tipo
Producto.
Tambin puede definir una implementacin predeterminada del mtodo de
fabricacin que devuelva un objeto del producto concreto (herencia).
Puede llamar al mtodo de fabricacin para crear un objeto Producto.

Creador Concreto [GestorLibro, GestorPelicula, GestorMusica, GestorJuegoVideo]

Redefine el mtodo de fabricacin para devolver una instancia de un


producto concreto

Ing. Judith Meles

69

Factory Method : Aplicacin


Dinmica
sd Factory Method

:PantallaAdmArticulo

:GestorLibro

tomarConfirmacionArticulo()

Toda la informacin
para crear una
instancia de Libro
estn en el gestor.

Ing. Judith Meles

crearArticulo()
new(isbn :int, autor :Autor[],
tematica :Tematica,
resumen :String)

:Libro

70

35

Factory Method: Aplicacin


Procedimiento

La PantallaAdmArticulo confirma la creacin del artculo (Libro) al


GestorCreacionLibro y este procede a la creacin del objeto Libro.
Para su implementacin primero se deber identificar los diferentes
Productos que se pueden crear y as definir el producto abstracto
(Articulo).
Se debern implementar los Productos Concretos.
Se especificar el comportamiento comn de los creadores,
determinado por el mtodo de fabricacin crearArtculo() del creador
abstracto.
Por ltimo se debern construir las clases responsables de la creacin
de cada Producto Concreto (GestorLibro, GestorJuegoVideo, etc.) que
implementarn el mtodo de fabricacin especfico para el mismo.

Ing. Judith Meles

71

Faade / Fachada
Propsito

Proporciona una nica interfaz a un conjunto de interfaces de un


subsistema. Define una interfaz de ms alto nivel que facilita el uso de
un subsistema.

Motivacin

Reducir las dependencias entre subsistemas.


Un entorno de programacin que ofrece una librera de clases que
proporcionan acceso a su subsistema compilador: Scanner, Parser,
ProgramNode, ByteCodeStream y ProgramNodeBuilder. Clase
Compiler acta como fachada.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

72

36

Estructura
Fachada

Ing. Judith Meles

73

Faade / Fachada
Aplicabilidad

Ing. Judith Meles

Proporcionar una interfaz simple a un subsistema.


Hay muchas dependencias entre clientes y las clases
que implementan una abstraccin.
Se desea una arquitectura de varios niveles: una
fachada define el punto de entrada para cada nivel
subsistema.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

74

37

Faade / Fachada
Consecuencias

Facilita a los clientes el uso de un subsistema, al ocultar


sus componentes.
Proporciona un acoplamiento dbil entre un subsistema y
los clientes: cambios en los componentes no afectan a los
clientes.
No se impide a los clientes el uso de las clases del
subsistema si lo necesitan. Se puede elegir entre facilidad
y funcionalidad
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

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

Ing. Judith Meles

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

Definir los servicios que sern brindados por la Fachada.

Crear una clase de fabricacin pura de acceso pblico que proporcione a


los clientes los servicios definidos (FachadaEnvio).

Implementar los mtodos que realizan la peticin a las clases del


subsistema.

Establecer las relaciones requeridas con los objetos propios del


subsistema .
Ing. Judith Meles

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 .

Ing. Judith Meles

78

39

Composite
Propsito

Componer objetos en estructuras jerrquicas para representar


jerarquas todo/parte. Permite a los clientes manejar a los objetos
primitivos y compuestos de forma uniforme.

Motivacin

Modelar figuras compuestas


Modelar paquetes de valores (acciones, bonos,..)

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

79

Composite

Estructura

Componente
Cliente

operacion()
aadir(Componente)
eliminar(Com ponente)
obtenerHijo()
hijos

Herencia
Compues to
Hoja
operacion()

Ing. Judith Meles

operacion()
aadir(Componente)
eliminar(Com ponente)
obtenerHijo()

80

40

Estructura

Composite
Realizacin

Ing. Judith Meles

81

Composite
Aplicabilidad

Ing. Judith Meles

Se quiere representar jerarquas todo/parte


Se quiere que los clientes ignoren la diferencia entre
objetos compuestos y los objetos individuales que los
forman.

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

82

41

Composite
Consecuencias

Jerarqua con clases que modelan objetos primitivos y objetos


compuestos, que permite composicin recursiva.
Clientes pueden tratar objetos primitivos y compuestos de modo
uniforme.
Es fcil aadir nuevos tipos de componentes.
No se puede confiar al sistema de tipos que asegure que un objeto
compuesto slo contendr objetos de ciertas clases, necesidad de
comprobaciones en tiempo de ejecucin.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

83

Composite
Implementacin

Identificar clases de agregacin


Identificar componentes y hojas.
Referencias explcitas al padre, para simplificar el recorrido y la
gestin de una estructura compuesta.
Maximizar la interfaz Componente, para que los clientes se
despreocupen de las clases Hoja o Compuesto.
Declarar las operacin de gestin de los hijos: equilibrio entre
seguridad y transparencia.

Ing. Judith Meles

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

Ing. Judith Meles

85

Composite
Participantes

Componente (IComponenteCatalogo)

Hoja (Articulo: Libro, Pelcula, Msica, JuegoDeVideo)

Implementa la operacin getDescripcinJerarqua() que es uniforme a


toda la jerarqua.

Compuesto (CompuestoCatalogo)

Declara la interfaz de los objetos de la composicin.

Implementa todas las operaciones definidas en el Componente


(IComponenteCatalogo) y las operaciones especficas para la
administracin de los elementos que lo componen.

Cliente (GestorCatalogo)

Ing. Judith Meles

Realiza la peticin al objeto que implementa la interfaz Componente

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

El mtodo polimrfico "getDescripcinJerarqua()" recorre y devuelve el nombre de todos


los elementos de la jerarqua: del catlogo activo, de las X secciones del dicho catlogo,
de las Y subsecciones y de los Z artculos que la componen.

Ing. Judith Meles

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

Las clases (Artculo y CompuestoCatalogo) implementan la interfaz IComponenteCatalogo.

Para el caso de Articulo (hoja) los mtodos de manipulacin de hijos


agregarComponente(),quitarComponente() y obtenerHijo() se implementan VACIOS.

El Compuesto (CompuestoCatalogo), es quien resuelve la peticin recursivamente hasta armar


todo el rbol.

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.

Ing. Judith Meles

88

44

Observer / Publish-Subscribe
Propsito

Define una dependencia uno-a-muchos entre objetos, de modo


que cuando cambia el estado de un objeto, todos sus
dependientes automticamente son notificados y actualizados.

Motivacin

Cmo mantener la consistencia entre objetos relacionados,


sin establecer un acoplamiento fuerte entre sus clases?
Ejemplo: Separacin Modelo-Vista
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

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

Ing. Judith Meles

92

Observer

Estructura

Para todos los O en


observadores {O ->
update() }

Realizacin

ISujeto
IObservador
separar(observador)
adjuntar(observador)
notificar()

1..*

SujetoConcreto
estadoSujeto
setEstado()
getEstado()

actualizar(sujeto)

ObservadorConcreto
estadoObservador
+theSujetoConcreto

actualizarEstado()

estadoObservador= Sujeto
-> getEstado()

Ing. Judith Meles

93

46

Observer
Colaboracin
: Otra

: Sujeto
1. setEstado( )

o1 :
Observador

o2 :
Observador

1.1. notificar( )
1.1.1. actualizar( )
1.1.2. actualizar( )

Ing. Judith Meles

94

Observer
Aplicabilidad

Ing. Judith Meles

Cuando un cambio de estado en un objeto requiere


cambios en otros objetos, y no sabe sobre cuntos
objetos debe aplicarse el cambio.
Cuando un objeto debe ser capaz de notificar algo a
otros objetos, sin hacer asunciones sobre quines son
estos objetos.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

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

Ing. Judith Meles

96

Observer
Consecuencias
Soporte para comunicacin de tipo broadcast:

Ing. Judith Meles

el subject no especifica al receptor concreto de la


notificacin
es posible aadir y eliminar observers en cualquier instante.

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

Ing. Judith Meles

98

Observer : Aplicacin
Consecuencias

Reusabilidad: Al separar el Sujeto de sus Observadores se permite


reutilizar sujetos y observadores independientemente.
Flexibilidad: Se pueden agregar y quitar observadores en cualquier
momento sin afectar al sujeto ni ha otros observadores, ya que el
Sujeto siempre ejecuta el mtodo notificar() para todos los
observadores existentes.
Disminuye el Acoplamiento: el sujeto conoce a sus observadores en
las clases Madre, lo cual reduce el acoplamiento entre las clases
instanciables, ya que la relacin es abstracta.
Es posible asegurar la consistencia entre Sujeto y Observadores
aplicando el patrn Template Method, haciendo que al finalizar la
actualizacin del Sujeto se llame al mtodo notificar(), evitando el
riesgo de llamarlo cuando an no se ha producido la actualizacin.

Ing. Judith Meles

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)

Ing. Judith Meles

102

Observer : Aplicacin
Participantes

Sujeto [ISujetoNotificacionPedido]: Proporciona una interfaz para


notificar a sus Observadores de sus modificaciones.
Observador [IObserverNotificacionPedido]: Proporciona una
interfaz para actualizar los objetos que deben enterarse de cambios en
el Sujeto.
SujetoConcreto [GestorEnvio y GestorPedido]: Almacena el estado
(valor de los atributos) que importan a los Observadores y notifica a
los mismos sobre cambios ocurridos.
ObservadorConcreto [NotificacionConfirmacionPedido,
NotificacionDespachoRetrasado, NotificacionEnvioParcial]

Ing. Judith Meles

103

51

Observer : Aplicacin

Dinmica
sd Observer-Pull

state
:EnCarroDeCompra
:PantallaCrearPedido

:GestorPedido

El GestorPedido crea un objeto que implementa


la InterfazNotificacion para notificar va e-mail al
cliente la confirmacin del pedido, y lo suscribe.
Luego el observador concreto de tipo
Notificacin Confirmacin Pedido, cuando lo
desea va al pedido a requerir su nuevo estado
(sus datos).

:Pedido

tomarConfirmacion()
confirmarPedido()
confirmarPedido()
new()

state
:Confirmado

setEstado(nuevo :
EstadoPedido)
new()
:NotificacionConfirmacionPedido
suscribir(o :IObserverNotificacionPedido)

notificar()
enviarMail(p :Pedido)

generarMail()
getNumero() :int
listarArticulosPedido() :String[]

Ing. Judith Meles

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.

Ing. Judith Meles

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

Ing. Judith Meles

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.

Ing. Judith Meles

107

53

Observer : Aplicacin
Participantes

Sujeto [ISujetoNotificacionPedido]: Proporciona una interfaz para notificar a


sus Observadores de sus modificaciones.
Observador [IObserverNotificacionPedido]: Proporciona una interfaz para
actualizar los objetos que deben enterarse de cambios en el Sujeto.
SujetoConcreto [GestorEnvio y GestorPedido]: Almacena el estado (valor
de los atributos) que importan a los Observadores y notifica a los mismos
sobre cambios ocurridos.
ObservadorConcreto [NotificacionConfirmacionPedido,
NotificacionDespachoRetrasado, NotificacionEnvioParcial]: Debe
mantener su estado consistente al del sujeto concreto, para lo cual
implementa el mtodo actualizar().

Ing. Judith Meles

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

Ing. Judith Meles

111

Iterator (Iterador)
Motivacin

Ing. Judith Meles

Una clase Iterator define la interfaz para acceder a


una estructura de datos (p.e. una lista).
Iteradores externos vs. Iteradores internos.
Iteradores externos: recorrido controlado por el
cliente
Iteradores internos: recorrido controlado por el
iterador
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

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

Ing. Judith Meles

113

Iterador Externo Polimrfico


Herencia

Ing. Judith Meles

114

56

Iterador Externo Polimrfico


Realizacin

Ing. Judith Meles

115

class Iterator-Seccion
interface
IIterador

interface
IAgregado
+

+
+
+
+
+

crearIterador(elementos :Object[]) :IIterador

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

Ing. Judith Meles

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

crearIterador(elementos :Object[]) :IIterador

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

Ing. Judith Meles

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

Cuando necesitamos recorrer o mostrar los artculos (libros, pelculas, msica o


juegos) o secciones del catlogo se invoca a los mtodos listarArticulosActivos() y
listarNombreSecciones(), respectivamente.
En la dinmica se mostrar el ejemplo con JuegoVideo.
Este mtodo invoca a crearIterador() para establecer el Iterador.
Finalmente se definen los mtodos necesarios para realizar el recorrido de los
elementos: haTerminado(), siguiente(), cumpleFiltro(), etc.

Ing. Judith Meles

118

58

Iterator: Aplicacin

Dinmica:
sd Iterator-Seccion

:GestorCatalogo

:Catalogo

:SeccionCatalogo

listarArticulosDestacados()
listarNombreSecciones() :
String[]

crearIterador(elementos :
Object[]) :IIterador
new(elem :Object[])

loop recorrer secciones

iterator
:IteradorSeccion

haTerminado() :boolean

[haTerminado():=false]

siguiente() :Object
getNombre() :String

Ing. Judith Meles

119

Iterator: Aplicacin

Dinmica:
sd Iterator-Articulo

:GestorCatalogo

:Catalogo

:SeccionCatalogo

:JuegoVideo

listarPorSeccion() :String[][]
*listarArticulos() :String
crearIterador(elementos :Object[]) :IIterador
new(elem :Object[], filtros :String[])

loop recorrer articulos


[haTerminado() := false]

iterator
:IteradorArticulo

haTerminado() :boolean
siguiente() :Object
cumpleFiltro(filtros :String[]) :
boolean
estaActivo() :boolean
getTitulo() :String

Ing. Judith Meles

120

59

Iterator: Aplicacin conjunta con Composite


Participantes

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

Cuando necesitamos recorrer o mostrar los artculos (libros, pelculas, msica o


juegos) de un catlogo se invoca a los mtodos listarCatalogo() y
listarArticulosActivos(), respectivamente.
En la dinmica se mostrar el ejemplo con JuegoVideo.
Este mtodo invoca a crearIterador() para establecer el Iterador.
Finalmente se definen los mtodos necesarios para realizar el recorrido de los
elementos: haTerminado(), siguiente(), cumpleFiltro(), etc.

Ing. Judith Meles

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

+
+
+
+
+
+

agregarComponente(c :IComponenteCatalogo) :void


getDescripcionJerarquia() :String[]
getNombre() :String
listarArticulosActivos() :void
obtenerHijo() :IComponenteCatalogo
quitarComponente(c :IComponenteCatalogo) :void

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

Iterator: Aplicacin sobre el composite

Dinmica:
sd Iterator-CompuestoCatalogo

catalogo
:CompuestoCatalogo

seccionJuegoVideo
:CompuestoCatalogo

:GestorCatalogo

:JuegoVideo

listarCatalogo() :String[][]
crearIterador(elementos :Object[]) :IIterador
new(elementos :object[])

iterator
:IteradorCompuesto

loop recorrer compuesto catlogo


[haTerminado() := false]
haTerminado() :boolean
siguiente() :Object
getDescripcionJerarquia() :String
getNombre() :String
crearIterador(elementos :Object[]) :IIterador
iterador
:IteradorCompuesto

new()

loop recorrer Secciones


haTerminado() :boolean

[haTerminado ():= false]

siguiente() :Object

getDescripcionJerarquia() :String

getNombre() :String
listarArticulosActivos()
crearIterador(elementos :Object[]) :IIterador
new(elem :Object[], filtros :String[])

loop recorrer articulos activos


[haTerminado() := false]

iterator
:IteradorArticulo

haTerminado() :boolean
siguiente() :Object
cumpleFiltro(filtros :String[]) :boolean
estaActivo() :boolean
getDescripcionJerarquia() :String

getTitulo() :String

Ing. Judith Meles

123

Memento
Propsito

Captura y exterioriza el estado interno de un objeto, sin violar el


encapsulamiento, de modo que el objeto puede ser restaurado
a ese estado ms tarde.

Motivacin

Ing. Judith Meles

Algunas veces es necesario registrar el estado interno de un


objeto: mecanismos checkpoints y deshacer cambios que
permiten probar operaciones o recuperacin de errores.
Mecanismo de transacciones
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

127

61

Memento
Aplicabilidad

Una parte del estado de un objeto debe ser guardado


para que pueda ser restaurado ms tarde.

Una interfaz para obtener el estado de un objeto


podra romper el encapsulamiento exponiendo detalles
de implementacin.

Ing. Judith Meles

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

Ing. Judith Meles

130

Memento : Aplicacin

Estructura
class Memento
entity
PreferenciaCliente
-

color :ColorPredefinido
favorito :LinkFavorito[]

+
+
+
+
+
+

crearMemento(l :LinkFavorito[], c :ColorPredefinido) :MementoPreferencia


establecerMemento(m :MementoPreferencia) :void
getColor() :ColorPredefinido
getLinkFavorito() :LinkFavorito[]
setColor(c :ColorPredefinido) :void
setLinkFavorito(l :LinkFavorito[]) :void

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

Ing. Judith Meles

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)

Ing. Judith Meles

133

64

Memento : Aplicacin
sd Memento-PreferenciasActuales

Dinmica:
Preferencias
Actuales

:GestorCliente

:Cliente

:PreferenciaCliente

mostrarPreferenciasActuales() :String[][]
getLinkFavorito() :LinkFavorito
getColor() :ColorPredefinido

Ing. Judith Meles

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[])

Ing. Judith Meles

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?

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

136

Builder
Herencia

Realizacin

Ing. Judith Meles

137

66

Builder
Aplicabilidad

Ing. Judith Meles

Cuando el algoritmo para crear un objeto complejo debe ser


independiente de las piezas que conforman el objeto y de
cmo se ensamblan.
El proceso de construccin debe permitir diferentes
representaciones para el objeto que se construye.

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

138

Builder
Consecuencias

Permite cambiar la representacin interna del


producto.
Separa el cdigo de la representacin del cdigo
para la construccin.
Proporciona un control fino del proceso de
construccin.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

139

67

Builder
Implementacin

La interfaz de Builder debe ser lo suficientemente general


para permitir la construccin de productos para cualquier
Builder concreto.
La construccin puede ser ms complicada de aadir el
nuevo token al producto en construccin.
Los mtodos de Builder no son abstractos sino vacos.
Las clases de los productos no tienen una clase abstracta
comn.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

Builder: Aplicacin

Estructura
class Builder

director
DirectorConstruccionCatalogo
-

140

constructor :ConstructorCatalogo

+ construir(sec :String[], art :String[][], img :String[]) :void


+ new(con :ConstructorCatalogo) :void

constructor
ConstructorCatalogoWeb

interface
ConstructorCatalogo

1
+
1 +
+
+

construirArticulo(art :String[][]) :void


construirImagen(img :String[]) :void
construirProducto() :void
construirSeccion(sec :String[]) :void

1
constructor
ConstructorCatalogoImpreso
control
GestorPublicacionCatalogo
+ publicarCatalogoResumen() :void

reporte :ImpresorCatalogo

+
+
+
+

construirArticulo(art :String[][]) :void


construirImagen(img :String[]) :void
construirProducto() :void
construirSeccion(sec :String[]) :void

constructor
ConstructorCatalogoResumenWeb
-

reporte :PantallaCatalogoResumenWeb

+
+
+
+
+
+

construirArticulo(art :String[][]) :void


construirImagen(img :String[]) :void
construirProducto() :void
construirSeccion(sec :String[]) :void
new()
obtenerProducto() :PantallaCatalogoResumenWeb

boundary
ImpresorCatalogo
+ imprimirArticulo(info :String[]) :void
+ imprimirSeccion(nom :String) :void

Ing. Judith Meles

boundary
PantallaCatalogoResumenWeb
-

infoArticulos :String[][]
nombreSecciones :String[]

+
+
+
+

agregarArticulo(a :String[][]) :void


agregarSeccion(s :String) :void
new()
publicar() :void

reporte :PantallaCatalogoWeb

+
+
+
+

construirArticulo(art :String[][]) :void


construirImagen(img :String[]) :void
construirProducto() :void
construirSeccion(sec :String[]) :void

1
boundary
PantallaCatalogoWeb
-

btnAplicarFiltro
btnSeleccionar
filtros
infoArticulos :String[][]
lblFechaVigente
listaSecciones :String[]
rutaImagen :String[]

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

agregarArticulo(a :String[][]) :void


agregarImagen(ruta :String[]) :void
agregarSeccion(s :String) :void
confirmarCierre() :void
habilitarPantalla()
ingresarCantidad() :void
mostrarArticulosPorSecciones()
mostrarFechaVigencia()
mostrarSecciones()
new()
permitirAgregarACarroDeCompras() :void
permitirAplicarFiltro()
permitirConsultarArticulo()
permitirNavegarPorSeccion() :void
publicar() :void
seleccionarAgregarArticulo() :void
seleccionarOpcionConsultarCatalogo()

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.

Ing. Judith Meles

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

construir(sec :String[], art :String[][], img :String[])


construirProducto()
new()

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

Ing. Judith Meles

144

Abstract Factory (Factora Abstracta)


Propsito

Proporcionar una interfaz para crear familias de


objetos relacionados o dependientes sin
especificar la clase concreta

Motivacin

Ing. Judith Meles

Un toolkit interfaz de usuario que soporta


diferentes formatos: Windows, Motif, X-Windows,..
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

145

70

Abstract Factory
Estructura

Ing. Judith Meles

Realizacin

146

Abstract Factory
Estructura

Herencia
Ing. Judith Meles

147

71

Abstract Factory
Aplicabilidad

Un sistema debera ser independiente de cmo sus productos son


creados, compuestos y representados
Un sistema debera ser configurado para una familia de productos.
Una familia de objetos productos relacionados es diseado para
ser utilizado juntos y se necesita forzar la restriccin.
Se quiere proporcionar una librera de clases de productos y se
quiere revelar slo la interfaz, no la implementacin.

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

148

Abstract Factory
Consecuencias

Ing. Judith Meles

Asla a los clientes de las clases concretas de


implementacin.
Facilita el intercambio de familias de productos.
Favorece la consistencia entre productos
Es difcil soportar nuevas clases de productos.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

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

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

150

Abstract Factory: Aplicacin


Procedimiento

Analizar la situacin determinando elementos que siendo del mismo tipo


varan en su comportamiento (Productos).
Identificar el patrn que da origen a las variaciones en los productos
(fbricas).
Implementar las caractersticas que varan de los productos es decir:
implementar los productos concretos.
Implementar las fbricas concretas que crean los productos concretos.
Establecer en el cliente la relacin de conocimiento con la fbrica abstracta
y el producto abstracto.
Entendemos que el cliente recibir por parmetros la identificacin de la
fbrica concreta. Y a partir de esta ltima se determinarn los productos
concretos que corresponda.

Ing. Judith Meles

151

73

Abstract Factory: Aplicacin

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
-

formatearCodPostal(cod :String) :String


formatearNroTelefono(t :String) :String

formatoCodPostal :String
formatoTelefono :String

fabrica
FabricaChile

interface
ICalendario

1
interface
IFabricaPais
+
+
+
+
+

formatoCodPostal :String
formatoTelefono :String

formatearCodPostal(cod :String) :String


formatearFecha(d :Date) :String
formatearFechaLarga(d :Date) :String
formatearHora(d :Date) :String
formatearNroTelefono(t :String) :String

producto
CalendarioChile
-

+
+
+

formatearFecha(d :Date) :String


formatearFechaLarga(d :Date) :String
formatearHora(d :Date) :String

formatoFecha :String
formatoFechaLarga :String
formatoHora :String
separadorFecha :char
separadorHora :char

fabrica
FabricaArgentina

Ing. Judith Meles

producto
CalendarioArg
-

formatoFecha :String
formatoFechaLarga :String
formatoHora :String
separadorFecha :char
separadorHora :char

152

Abstract Factory : Aplicacin


Participantes

Fbrica Abstracta [IFabricaPais]:

Fbricas Concreta [FabricaArgentina y FabricaChile]:

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.

Producto Abstracto [ICalendario, IInfoPersonal]:

Declara la interfaz para un crear cada producto determinado.

Producto Concreto [CalendarioArg, CalendarioChile, InfoPersonalArg, InfoPersonalChi]

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.

Ing. Judith Meles

153

74

Dinmica

Abstract Factory: Aplicacin

sd AbstractFactory
fabrica
:FabricaArgentina
:GestorCliente

:Cliente

producto
:CalendarioArg

producto
:InfoPersonalArg

:Pais

aplicarFormatoPais()
conocerPais() :Pais
getFrabrica() :IFabricaPais
formatearFechaNacimiento() :String
getFechaNacimiento() :Date
formatearFecha(d :Date) :String

formatearFecha(d :Date) :String

formatearTelefono() :String
getTelefono() :String
formatearNroTelefono(t :String) :String
formatearNroTelefono(t :String) :String

Ing. Judith Meles

154

Abstract Factory: Aplicacin


Procedimiento
Obtener Formato Fecha

El GestorCliente necesita configurar el formato de fecha en funcin


del pas, para ello le pide al Cliente la referencia del pas al que
pertenece.
Luego le pide a la FabricaArgentina que cree la InfoPersonalArg
y que obtenga la mscara de telfono.
Luego el GestorCliente le enva a la PantallaCliente la
informacin para configurar campo de nmero de telfono, segn el
pas.

Ing. Judith Meles

155

75

<<sing leton>>

Num eroPedido

Ges torPedido
(f rom Analy sis Model)

Des pachadoParcial

Pedido
Es tado

(f rom Analy sis Model)


1

1..*

Carrito

Des tino

Entregado

(f rom Analy sis Model)

CarritoCom pleto

Form aEnvo

1..*

(f rom Analy sis Model)

MedioTrans porte
(f rom Analy sis Model)

1..*

Des pachado
Cerrado

(f rom Analy sis Model)

(f rom Analy sis Model)

Cliente

(f rom Analy sis Model)

0..*

Articulo
(from Analysis Model)

TipoArticulo

0..*

1..*

(f rom Analy sis Model)

Provincia

Localidad

DetallePedido

Em presaTrans porte
(f rom Analy sis Model)

1..*

Pais

(f rom Analy sis Model)

Ges torDeCons ultas

(f rom Analy sis Model)

(f rom Analy sis Model)

Catlogo
(f rom Analy sis Model)

DirectorCons truccionCatalogo

Lis ta

1
1..*

Adm inis tradorDePublicaciones


IteradorSecciones

0..*

Seccion
(f rom Analy sis Model)

ConstructorCatalogo
IteradorArticulos

Vista Parcial del


Modelo de Diseo
Resultante

Iterador

Cons tructorCatalogoRes um enWeb

PantallaCatalogoRes um enWeb

Cons tructorCatalogoIm pres o

Im pres orCatalogo

Cons tructorCatalogoWeb

PantallaCatalogoWeb

Ing. Judith Meles

158

Mapeo de Clases a Bases de


Datos Relacionales

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

Ing. Judith Meles

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

Total Diario [1]

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)

Ing. Judith Meles

162

Solucin: Super Objeto Persistente


ObjectToStore

Object

PersistentObjectAdministrador

ObjectState

PersistentState

RDBPort
hereda
Port

Item de Depsito

Item

PersistentItemAdministrador

Ing. Judith Meles

ItemState

PersistentItemState

163

78

Objetos en Tablas: Herencia


ECU
Valor de Depsito[1]
Nombre [1]

String

Total Diario [1]

Entero

Item de
Depsito

hereda

hereda

Ancho del Cuello [1]


Alto [1]

Ancho [1]

Medidas
String
Medidas

Alto [1]

Lata

Ancho Inferior [1]

Botella

Medidas
String
Medidas
String
Medidas
String

Ing. Judith Meles

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

Ancho del Cuello

Botella25

0.30

173

23

Botella75

0.50

78

32

Ing. Judith Meles

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

Ancho InferiorAncho del Cuello


6
9

2
3

Ing. Judith Meles

166

Caractersticas de las BDOO


Objetos complejos. Debera soportar la nocin de objetos complejos.
Identidad de Objetos. Cada objeto debe tener una identidad
independiente de sus valores internos.
Encapsulamiento. Debe soportar el encapsulamiento de datos y
comportamiento en los objetos.
Tipos o Clases. Debera soportar un mecanismo de estructuracin,
en forma de tipos o clases.
Jerarqua. Debera soportar la nocin de herencia.
Ligadura Tarda. Debera soportar sobreescritura y ligadura tarda.
Completitud. El lenguaje de manipulacin debera ser capaz de
expresar cada funcin calculable.
Extensibilidad. Debera ser posible agregar nuevos tipos.
Ing. Judith Meles

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.

Ing. Judith Meles

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

Ing. Judith Meles

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.

Materializacin: transformar un registro en objeto


Desmaterializacin: transformar un objeto en registro.
Conversor de Base de Datos: es el responsable de la materializacin y desmaterializacin
de los objetos.
Cach: Almacn de objetos materializados en esta memoria por cuestiones de rendimiento.
Estado de Transaccin de los objetos: El estado de los objetos para saber si se modificaron
en funcin de su estado almacenado.

Operaciones de Transaccin: confirmar y deshacer


Materializacin Perezosa: no todos los objetos se materializan a la vez, se hace bajo
demanda, es decir, cuando se lo necesita.
Proxies Virtuales: Referencia inteligente utilizada para la materializacin perezosa.
Ing. Judith Meles

172

82

Patrn: Identificador de Objetos


Es necesario contar con una forma consistente de
relacionar objetos con registros y asegurar que la
materializacin repetida no de cmo resultado
objetos duplicados.
El Patrn propone asignar un identificador de
objeto (OID) a cada registro y objeto (o proxy de
objeto)
Ing. Judith Meles

173

Patrn: Identificador de Objetos


: Fabricante
ciudad : Salta
nombre: Fruta Fresca
oid: xyz123

Ing. Judith Meles

Clave
Primaria

OID

Nombre

ciudad

xyz123

Fruta Fresca

Salta

abc345

Expofrut

San Carlos

174

83

Acceso al Servicio de Persistencia


Patrn Fachada: proporciona interfaz uniforme a
un subsistema.
Se necesita una operacin para recuperar un
objeto dado un OID.
Tambin se necesita conocer el tipo del objeto
que se va a materializar, por tanto, se debe
proporcionar el tipo de la clase a la que
pertenece el objeto.
Ing. Judith Meles

175

La Fachada de Persistencia
:
AdaptadorBDProductos

:
FachadaDePersistencia
obj:= get(...)

// ejemplo de uso de la fachada


OID oid = new OID ("XYZ123);
EspecificacionDelProducto ep = (EspecificacionDelProducto) FachadaDePersistencia.getInstancia(). get(oid,
EspecificacionDelProducto.class);

Ing. Judith Meles

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:

Fuerte acoplamiento de la clase persistente con su almacenamiento. (Violacin


del Patrn Bajo Acoplamiento).
Responsabilidades complejas y no relacionadas (Violacin del Patrn Alta
Cohesin).

Ing. Judith Meles

177

Patrn Conversor (Mapper) de Base de Datos


o Intermediario (Broker) de Base de Datos
Enfoque clsico de correspondencia
Indirecta.
Utiliza otros objetos para establecer la
correspondencia con los objetos persistentes.
Propone crear una clase responsable de
materializar y desmaterializar los objetos.

Ing. Judith Meles

178

85

Conversor de Base de Datos

Ing. Judith Meles

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.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

180

86

Bridge / Handle
Estructura

Herencia

Ing. Judith Meles

Estructura
Cliente

181

Bridge / Handle
Realizacin
Abstraccion

imp

Implementador

operacion()

operacionImp()

imp->operacionImp();

ImpConcretoA
AbstraccionRefinada
operacionImp()

Ing. Judith Meles

ImpConcretoB
operacionImp()

182

87

Bridge
Aplicabilidad

Ing. Judith Meles

Se quiere evitar una ligadura permanente entre una


abstraccin y su implementacin, p.e. porque se quiere
elegir en tiempo de ejecucin.
Abstracciones e implementaciones son extensibles.
Cambios en la implementacin de una abstraccin no
deben afectar a los clientes (no recompilacin).
Ocultar a los clientes la implementacin de la interfaz.
Se tiene una proliferacin de clases, como suceda en la
Motivacin.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

183

Bridge
Consecuencias

Ing. Judith Meles

Un objeto puede cambiar su implementacin en t.e.


Cambios en la implementacin no motivarn
recompilaciones de la clase Abstraccin y sus clientes.
Se mejora la extensibilidad
Se ocultan detalles de implementacin a los clientes
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

184

88

Bridge
Implementacin

Aunque exista una nica implementacin puede usarse el


patrn para evitar que un cliente se vea afectado si cambia.
Cmo, cundo y dnde se decide que implementacin
usar?
Constructor de la clase Abstraccion
Elegir una implementacin por defecto
Delegar a otro objeto, p.e. un objeto factora
Se puede usar herencia mltiple para heredar de la
abstraccin y de una implementacin concreta, pero se liga
una interface a una implementacin de forma permanente.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

Ing. Judith Meles

Estructura

185

Bridge : Aplicacin

class Bridge
control
GestorCliente
+
+

crearPedido() : void
guardarPedido() : void

abstraccion
IntermediarioBD
+

valorObjeto(objeto :Object) : void

abstraccion
IntermediarioBDArticulo

Ing. Judith Meles

abstraccion
IntermediarioBDPedido

entity
Pedido
+

armarEstadoPedido(comando :OrdenBD) : void

interface
ImpIntermediarioBD
+
+
+

dematerializeWith(obj :Object) : void


existeOID(id :String) : boolean
materializeWith() : Object

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)

Ing. Judith Meles

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

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

190

91

Mtodo Plantilla para un


Framework de GUI

Ing. Judith Meles

191

Materializacin con el Mtodo Plantilla


La estructura bsica del algoritmo para materializar
un objeto es:
if (objeto est en cach)
return objeto
else
crear un objeto a partir de su representacin en
el almacenamiento
guardar el objeto en la cach
return objeto

El punto de variacin es la manera de crear el objeto


a partir del almacenamiento.
Ing. Judith Meles

192

92

Mtodo Plantilla para Objetos


Conversores

Ing. Judith Meles

193

Redefinicin del Mtodo de


Enganche

Ing. Judith Meles

194

93

Ajustando el cdigo con el Mtodo


Plantilla

Ing. Judith Meles

195

Framework de Persistencia
Pers is tencia

Pers is tenci aNuevaEra

Ing. Judith Meles

196

94

Patrn: Gestin de Cach


Es conveniente mantener los objetos materializados en un
cach local para mejorar el rendimiento de y dar soporte a las
operaciones de gestin de las transacciones.
El patrn propone que el ConversorBDR sea el responsable de
mantener esta cach, es decir cada conversor de objetos
persistente sea responsable de mantener su propia cach.
Al materializar los objetos, quedan en el cach con su OID
como clave.
El conversor primero busca en la cach para evitar
materializaciones innecesarias.

Ing. Judith Meles

197

Sentencias SQL
Sentencias SQL en distintas clases conversores no es terrible,
pero se puede mejorar
En lugar de eso:

Existe una nica clase OperacionesBRD, donde se renen las


operaciones SQL (SELECT, INSERT)
Las clases conversores colaboran con ella para obtener un registro
de BD o un conjunto de registros (por ejemplo ResultSet)

Con esta solucin se obtienen los siguientes beneficios:

Ing. Judith Meles

Facilita mantenimiento y rendimiento.


Encapsulamiento de mtodos y detalles de acceso.

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

Mquina de Estado: Objeto


Persistente
new[ desde la BD ]
save

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

Ing. Judith Meles

200

96

State

Ing. Judith Meles

201

Objetos Persistentes
La situacin genrica de diseo responde a
esta estructura:
Dominio

Persistencia
ObjetoPersistente
oid : OID
marcaDeTiempo : FechaHora

EspecificacionDelProducto
commit()
rollback()
eliminar()
guardar()

Ing. Judith Meles

202

97

Objeto Persistente y el Patrn Estado


Esta es la situacin que se resolver con el patrn Estado, los mtodos
commit y rollback requieren una estructura similar de lgica de casos,
basada en el estado de la transaccin, ambos mtodos ejecutan diferentes
acciones pero tienen estructuras lgicas similares.
Public void commit()
{
Switch (estado)
{
Case VIEJO_SUCIO
//
break;
Case VIEJO_SUCIO
//
break;

Public void rollback()


{
Switch (estado)
{
Case VIEJO_SUCIO
//
break;
Case VIEJO_SUCIO
//
break;

Ing. Judith Meles

203

Aplicacin del Patrn Estado


rollback ={estado.rollback (this)}
commit={estado.commit (this)}
eliminar ={estado.eliminar (this)}
guardar ={estado.guardar (this)}

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() )}

Ing. Judith Meles

{ // commit
FachadaDePersistencia.getInstancia().insertar (obj)
obj.setEstado(EstadoViejoLimpio.getInstancia() )}
{ // commit
FachadaDePersistencia.getInstancia().eliminar (obj)
obj.setEstado(EstadoViejoAEliminar.getInstancia() )}

204

98

Diseo de una transaccin


Transaccin: unidad de trabajo (conjunto de tareas) cuya
terminacin es atmica.
En los servicios de persistencia incluyen: insercin,
actualizacin, eliminacin de objetos.
Una transaccin puede incluir por ejemplo: 2 inserciones, una
actualizacin y tres eliminaciones.
Considerar que el orden en que la aplicacin aade las tareas
podra no reflejar el mejor orden de ejecucin. Las tareas
necesitan que se ordenen justo antes de la ejecucin.
Para ello se utiliza el Patrn COMMAND.

Ing. Judith Meles

205

Command
Propsito

Encapsula un mensaje como un objeto, permitiendo


parametrizar los clientes con diferentes solicitudes,
aadir a una cola las solicitudes y soportar funcionalidad
deshacer/rehacer (undo/redo)

Motivacin

Ing. Judith Meles

Algunas veces es necesario enviar mensaje a un objeto


sin conocer el selector del mensaje o el objeto receptor.
Por ejemplo widgets (botones, mens,..) realizan una
accin como respuesta a la interaccin del usuario, pero
no se puede explicitar en su implementacin.
Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

206

99

Command

Estructura
Cliente

Herencia

Orden

Invocador

ejecutar()

Receptor
accin()

+receptor

OrdenConcreta
estado

ejecutar:
receptor.accin()

ejecutar()

Ing. Judith Meles

207

Estructura

Command

Realizacin

IOrden
Invocador
Cliente

ejecutar()
Receptor
accin()

ejecutar:
receptor.accin()

+receptor
OrdenConcreta
estado
ejecutar()

Ing. Judith Meles

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

Ing. Judith Meles

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

Ing. Judith Meles

211

Command : Aplicacin

Estructura

Ing. Judith Meles

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.

Ing. Judith Meles

213

Command : Aplicacin
Procedimiento

Ing. Judith Meles

El GestorPedido crea la instancia del IntermediarioBD que


utilizar para guardar el Pedido recin creado.
A continuacin, crea la OrdenBD comando- apropiada
para registrar el pedido.
Luego le solicita al mismo Pedido que se guarde.
El Pedido ejecuta la orden para que se registre el mismo.
La Orden RegistrarPedido llama a sus propios mtodos
para realizar la operacin solicitada, y finalmente le pide
colaboracin a un IntermediarioBD para guardarse en la
base de datos.
214

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[])

Ing. Judith Meles

215

Command : Aplicacin
Ventajas

Reduce el acoplamiento: La clase GestorPedido no necesita conocer


quien resuelve su peticin para registrar un pedido en la base de
datos.
Las rdenes son mtodos complejos tratados como clases, por lo que
tienen las ventajas de stas: Reusabilidad, Cohesin, ser referenciada
desde otra clase.
Para rdenes demasiado complejas es posible disear una agregacin
con una OrdenMacro que contiene objetos Orden. (Patrn Composite)
Existe mayor flexibilidad para agregar rdenes, ya que simplemente se
agregan clases, no es necesario modificar internamente a otras clases.

Ing. Judith Meles

216

104

Command : Aplicacin

Estructura
class Command

control
GestorPedido

entity
Pedido
+

armarEstadoPedido(comando :OrdenBD) : void

+
+
+

crearIntermediario() : IntermediarioBD
crearPedido() : void
crearRegistrarPedido() : void

comando
ModificarPedido
abstraccion
IntermediarioBD

interface
OrdenBD
+

comando
RegistrarPedido

ejecutar(obj :Object) : void


+
+
+
+
+
+

valorObjeto(objeto :Object) : void

ejecutar(obj :Object) : void


new(interm :IntermediarioBD) : void
registrarClienteDePedido(cli :Cliente) : void
registrarDetallePedido(detalle :DetallePedido[]) : void
registrarFormaEnvio(fe :FormaEnvio) : void
registrarMedioTransporte(mt :MedioTransporte) : void
implementador
ImpIntermediarioBDR
+

guardar(script :String[]) : boolean


new() : void

abstraccion
IntermediarioBDPedido
+

new() : void

interface
ImpIntermediarioBD
+
+
+

dematerializeWith(obj :Object) : void


existeOID(id :String) : boolean
materializeWith() : Object

Ing. Judith Meles

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

El GestorPedido crea la instancia del


ImpIntermediarioBDR que utilizar para guardar el Pedido
recin creado.
A continuacin, crea la OrdenBD comando- apropiada
para registrar el pedido.
Luego le solicita al mismo Pedido que se guarde.
El Pedido ejecuta la orden para que se registre el mismo.
La Orden RegistrarPedido llama a sus propios mtodos
para realizar la operacin solicitada, y finalmente le pide
colaboracin a un IntermediarioBDPedido para guardarse
en la base de datos.

Ing. Judith Meles

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)

Ing. Judith Meles

220

106

Patrn Command para las


operaciones de la Base de Datos
anadirActualizar()
{
commands.add (CommandActualizarDB (obj) );
}

commit()
{
ordenar()
for each ICOmmand cmd
cmd.ejecutar()
}

deshacer() no est desarrollado,


pero debera tener una solucin
polimrfica en cada subclase que
conoce de manera nica como
deshacer una operacin.

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

Ing. Judith Meles

221

Materializacin Perezosa con un Proxy Virtual


A veces es conveniente diferir la materializacin de
objetos hasta que sea necesario, por cuestiones de
rendimiento.
La materializacin diferida de objetos hijos se llama
materializacin perezosa.
Esta materializacin se puede implementar utilizando un
Proxy Virtual.
Un Proxy Virtual es un proxy para otro objeto (el sujeto al
que se quiere acceder realmente) que materializa el
sujeto real cuando se referencia por primera vez.
Ing. Judith Meles

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

Ing. Judith Meles

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.

Ing. Judith Meles

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.

Ing. Judith Meles

Patrones de Creacin
Patrones de Estructura
Patrones de Comportamiento

226

109

Materializacin Perezosa con un Proxy Virtual

Ing. Judith Meles

227

Quin crea el Proxy Virtual?


La clase que crea la correspondencia entre la
EspecificacionDelProducto y la Base de
Datos,
Esta clase es responsable de decidir cuando
se materializa un objeto, cual de los objetos
debe materializarse de manera impaciente y
cual de manera perezosa.
Ing. Judith Meles

228

110

Ejemplo de Materializacin Impaciente


// MATERIALIZACION IMPACIENTE DEL FABRICANTE
class ConversorBDREspecificacionDelProducto extends ConversorPersitenciaAbstracto
{
Protected Object getObjetoDeAlmacenamiento (OID oid)
{
ResultSet rs =
OperacionesBDR.getInstancia().getDatosEspecificacionDelProducto (oid);
EspecificacionDelProducto ep = new EspecificacionDelProducto ();
ep.setPrecio (rs.getDouble (Precio));
// aqu est la escencia
String claveAjenaFabricante = rs.getString (FAB_OID);
ep.setFabricante ((Ifabricante)
FachadaDePersistencia.getInstancia().get(oidFab, Fabricante.class);

}
Ing. Judith Meles

229

Ejemplo de Materializacin Perezosa


// MATERIALIZACION PEROZOSA DEL FABRICANTE
class ConversorBDREspecificacionDelProducto extends ConversorPersitenciaAbstracto
{
Protected Object getObjetoDeAlmacenamiento (OID oid)
{
ResultSet rs =
OperacionesBDR.getInstancia().getDatosEspecificacionDelProducto (oid);
EspecificacionDelProducto ep = new EspecificacionDelProducto ();
ep.setPrecio (rs.getDouble (Precio));
// aqu est la escencia
String claveAjenaFabricante = rs.getString (FAB_OID);
OID oidFab = new OID (claveAjenaFabricante);
ep.setFabricante (new ProxyFabricante (oidFab));

}
Ing. Judith Meles

230

111

Relaciones entre los patrones


Adapter

Mem ento

Builder

Proxy

guardar el es tado de la iteracin


evitar la his ters is
crear com puestos

Iterator

Bridge

enum erar los hijos


com binadas us ando
Com pos ite
aadir operaciones

definir recorridos

aadir res pons abilidades a objetos


Vis itor
Decorator
aadir operaciones

Com m and

cam biar la piel en vez de las tripas


definir la gram tica

definir la cadena

Flyweight

Mediator

Chain of Res pons ability

com partir es trategias

com partir s m bolos term inales


aadir operaciones
com partir es tados
ges tin de dependencias com plejas
Interpreter
State

Strategy

Obs erver
definir los pas os de un algoritm o
Tem plate Method
Prototype

s uele us ar
Fa ctory M ethod

configurar fbricas dinm icam ente

Abs tract Factory

im plem entado us ando

ins tancia nica


Singleton

ins tancia nica


Facade

Ing. Judith Meles

231

Causas comunes de rediseo


Crear un objeto indicando la clase.

Abstract factory, Factory Method, Prototype

Dependencia de operaciones especficas

Chain of Responsability, Command

Dependencia de plataformas Hw o Sw

Abstract Factory, Bridge

Dependencia sobre representacin de objetos.

Abstract factory, Bridge, Memento, Proxy

Dependencias de algoritmos

Builder, Iterator, Strategy, Template Method,


Visitor

Acoplamiento fuerte entre clases

Abstract factory, Bridge, CoR, Command,


Facade, Mediator, Observer

Extender funcionalidad mediante subclases

Bridge, CoR, Composite, Decorator, Observer,


Strategy, State

Incapacidad de cambiar clases convenientemente

Adapter, Decorator, Visitor

Ing. Judith Meles

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

Ing. Judith Meles

233

113