Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Patrones Gof
Patrones Gof
ndice
ACCIN / COMMAND.....................................................................................................................................1
ADAPTADOR / ADAPTER...............................................................................................................................6
APODERADO / PROXY ...................................................................................................................................7
CADENA DE RESPONSABILIDADES / CHAIN OF RESPONSIBILITY...............................................11
COMPOSICIN / COMPOSITE ...................................................................................................................14
CONSTRUCTOR / BUILDER ........................................................................................................................15
DECORADOR / DECORATOR .....................................................................................................................19
ESTADO / STATE............................................................................................................................................21
ESTRATEGIA / STRATEGY .........................................................................................................................22
FBRICA ABSTRACTA / ABSTRACT FACTORY ...................................................................................25
FACHADA / FACADE.....................................................................................................................................26
INTRPRETE / INTERPRETER...................................................................................................................28
ITERADOR / ITERATOR...............................................................................................................................32
MEDIADOR / MEDIATOR ............................................................................................................................34
MTODO DE FBRICA / FACTORY METHOD.......................................................................................35
MTODO PLANTILLA / TEMPLATE METHOD .....................................................................................37
OBSERVADOR / OBSERVER .......................................................................................................................41
PESO MOSCA / FLYWEIGHT ......................................................................................................................42
PROTOTIPO / PROTOTYPE.........................................................................................................................44
PUENTE / BRIDGE .........................................................................................................................................46
RECUERDO / MEMENTO .............................................................................................................................48
________________________________________________________________________________
-i-
________________________________________________________________________________
- ii -
Coleccin de patrones
ACCIN / COMMAND
Tipo
Comportamiento, a nivel de objetos.
Problema
Uno de los elementos principales de una interfaz grfica de usuario (GUI) son los mens
desplegables. En el interior de un men se encuentran una serie de operaciones,
funciones o facilidades que una aplicacin ofrece con relacin a un tema en concreto
(Archivo, Edicin, Ver, Insertar, Formato, etc...). Las distintas entradas de un men tienen
la caracterstica de que al ser pinchadas con el ratn o al ser seleccionadas mediante
teclado ejecutan una operacin concreta. Un modelo de objetos que represente lo
anterior puede ser el siguiente:
APLICACI
N
Aadir(doc)
MEN
ENTRADA
Aadir(entr)
Seleccionar()
ENTRADA_ABRIR
aplicacin
doc
PedirNombre()
Seleccionar()
DOCUMENTO
nb=PedirNombre();
doc=new Documento(nb);
aplicacin->Aadir(doc);
doc->Abrir();
Abrir()
Cerrar()
Copiar()
El siguiente escenario muestra como interactan los objetos del modelo anterior:
doc:Documento
m:Men
e_a:Entrada_Abrir
ap:Aplicacin
new Entrada_Abrir(e_a)
Aadir(e_a)
new Documento(doc)
Seleccionar()
Aadir(doc)
Abrir()
________________________________________________________________________________
-1-
Coleccin de patrones
Otro elemento relevante de una GUI hoy en da son las barras de botones, al igual que,
en los comienzos de estas interfaces, tambin lo fueron, con una misin similar, las
combinaciones de teclas. En la mayora de los casos, un botn sirve para ejecutar alguna
de las funciones ms usuales de la aplicacin, por lo cual coincide, en la funcin que
desempea, con alguna entrada de algn men. Al modelo de objetos anterior se le han
aadido en negrita las novedades necesarias para representar las barras de botones:
BARRA
Aadir(bot)
APLICACI
N
Aadir(doc)
MEN
ENTRADA
Aadir(entr)
Seleccionar()
BOTN
Presionar()
ENTRADA_ABRIR
aplicacin
doc
PedirNombre()
Seleccionar()
BOTN_ABRIR
doc
PedirNombre()
Presionar()
DOCUMENTO
nb=PedirNombre();
doc=new Documento(nb);
aplicacin->Aadir(doc);
doc->Abrir();
Abrir()
Cerrar()
Copiar()
aplicacin
nb=PedirNombre();
doc=new Documento(nb);
aplicacin->Aadir(doc);
doc->Abrir();
b_a:Botn_Abrir
b:Barra
ap:Aplicacin
new Botn_Abrir(b_a)
Aadir(b_a)
new Documento(doc)
Presionar()
Aadir(doc)
Abrir()
Coleccin de patrones
Una solucin que nos permite evitar esa redundancia consiste en definir la accin que se
quiere ejecutar como un objeto, al cual pueden referirse todos aquellos elementos grficos
que lo deseen. Aplicando esta idea tenemos la siguiente estructura:
APLICACI
N
Aadir(doc)
MEN
ENTRADA
Aadir(entr)
AsignarAcc()
Seleccionar()
accin
accin
BARRA
Aadir(bot)
ACCIN
Ejecutar()
accin->Ejecutar()
ABRIR
aplicacin
doc
DOCUMENTO
Abrir()
Cerrar()
Copiar()
BOTN
PedirNombre()
Ejecutar()
nb=PedirNombre();
doc=new Documento(nb);
aplicacin->Aadir(doc);
doc->Abrir();
AsignarAcc()
Presionar()
accin->Ejecutar()
accin:Abrir
ent:Entrada
ap:Aplicacin
new Abrir(accin)
AsignarAcc(accin)
AsignarAcc(accin)
doc:Documento
Seleccionar()
ent:Entrada
accin:Abrir
ap:Aplicacin
Ejecutar()
new Documento(doc)
Aadir(doc)
Abrir()
doc:Documento
Presionar()
bot:Botn
accin:Abrir
ap:Aplicacin
Ejecutar()
new Documento(doc)
Aadir(doc)
Abrir()
Solucin
________________________________________________________________________________
-3-
Coleccin de patrones
accin
ACCIN
AsignarAccin()
AtenderPeticin()
Ejecutar()
accin->Ejecutar()
RECEPTOR
receptor
Operacin()
ACCIN CONCRETA
Ejecutar()
estado
CLIENTE
Relacionado con
Composicin puede usarse para implementar macroacciones, es decir, Acciones
compuestas.
No se trata de compartir un objeto concreto, sino una clase, a travs de instancias distintas de la misma.
Al representar las acciones como objetos de pleno derecho se da la posibilidad de modificarlas y/o
extenderlas, como al resto de los objetos, aplicando los mecanismos que para ello ofrece la teora de objetos.
3
Como se ha separado la peticin de la accin que la satisface, es posible que tengan un tiempo de vida
distinto, es decir, unas historias no necesariamente paralelas.
4
Una transaccin encapsula una serie de cambios efectuados sobre unos datos. Este patrn sirve muy bien a
este inters, porque permite estructurar el sistema en base a acciones de alto nivel, que se constituyen a partir de
operaciones primitivas.
________________________________________________________________________________
-4-
Coleccin de patrones
Recuerdo puede usarse para guardar el estado del sistema antes de que una
peticin sea atendida y as poder luego deshacer el efecto de la Accin ejecutada.
Una Accin de la que necesariamente debe hacerse copia antes de ser
introducida en la lista de histricos se comporta como un Prototipo.
Otros aspectos de inters
El Cliente es el responsable de crear la AccinConcreta correspondiente a una
peticin y de configurarla con el Receptor que sabe resolverla.
Accin suele ser una clase abstracta que define la interfaz para la ejecucin de
operaciones.
Para dar soporte a operaciones que se puedan deshacer y/o rehacer es preciso
almacenar la informacin de estado que permita hacerlo y si adems se pretende hacer
esto en mltiples niveles habr que mantener una lista de histricos con las acciones ya
ejecutadas.
Cada AccinConcreta establece una relacin entre el receptor de la peticin y la
accin que ste realiza para satisfacerla.
Para permitir deshacer y/o rehacer operaciones, el estado debe contener
informacin relativa a los receptores, las acciones y las operaciones involucradas en el
proceso.
Las habilidades de cada AccinConcreta van desde la simple invocacin de la
correspondiente Operacin del Receptor hasta la implementacin interna de toda la
accin que satisface la peticin.
________________________________________________________________________________
-5-
Coleccin de patrones
ADAPTADOR / ADAPTER
Tipo
Propsito
Convertir la interfaz de una clase para que se adapte a lo que el cliente que la usa
necesita, permitiendo as que trabajen juntas clases cuyas interfaces son incompatibles.
Estructura
A nivel de clases ...
CLIENTE
OBJETIVO
CLASE A ADAPTAR
Peticin()
PeticinConcreta()
ADAPTADOR
Peticin()
PeticinConcreta()
CLIENTE
OBJETIVO
CLASE A ADAPTAR
Peticin()
PeticinConcreta()
ADAPTADOR
Peticin()
adaptado
adaptado->PeticinConcreta()
Cuando usarlo
Cuando se quiere usar una clase ya existente, pero su interfaz no encaja con lo
que se necesita.
Cuando se quiere crear una clase reutilizable, para cooperar con otras clases que
no tengan, necesaria ni previsiblemente, interfaces compatibles.
(slo en la versin para objetos) Cuando se quieren usar varias subclases ya
existentes, pero no resulta prctico adaptarlas una a una mediante herencia. En vez de
esto, se puede adaptar la interfaz de la clase de la cual todas ellas heredan (y
especializan) su comportamiento.
Ventajas
A nivel de clases ...
________________________________________________________________________________
-6-
Coleccin de patrones
FORMA
VISTA DE UN TEXTO
Contorno()
ObtenerExtensin()
FORMA DE
FORMA DE TEXTO
LNEA
Contorno()
Contorno()
APODERADO / PROXY
texto
Tipo
________________________________________________________________________________
-7-
Coleccin de patrones
Peticin()
ELEMENTO REAL
Peticin()
APODERADO
Elemento
Real
Peticin()
Cuando usarlo
En cualquier situacin en que sea necesaria una referencia a un objeto ms verstil
y/o sofisticada que un simple puntero. Por ejemplo :
Un apoderado remoto proporciona un representante local para un objeto en un
espacio de direcciones diferente (J.Coplien los llama embajadores).
Un apoderado virtual crea por demanda objetos costosos.
Un apoderado de proteccin restringe, por motivos de seguridad, el acceso a un
objeto.
Una referencia inteligente es una sustitucin por un simple puntero, que
incorpora servicios adicionales como cuenta del n de referencias, carga de objetos
persistentes en memoria cuando estos son referenciados y uso de cerrojos para controlar
el acceso exclusivo a regiones crticas.
Ventajas
Se introduce un nivel de indireccin en el acceso al objeto, que permite al
apoderado remoto ocultar el hecho de que el objeto reside en un espacio de direcciones
distinto, al apoderado virtual realizar optimizaciones como la creacin de objetos por
demanda y al apoderado de proteccin y a las referencias inteligentes realizar tareas
adicionales de vigilancia sobre el objeto al que se accede. No obstante todo esto puede
resultar un inconveniente, por motivos de claridad e inteligibilidad del diseo.
Facilita otra optimizacin, relacionada con la creacin de objetos por demanda : la
tcnica de COPY-ON-WRITE, que slo hace efectiva la copia de un objeto oneroso
cuando el acceso a l es de escritura, no de lectura.
Relacionado con
Adaptador proporciona al objeto que est adaptando una interfaz diferente,
mientras que Apoderado presenta la misma interfaz que su representado. No obstante,
en el caso del apoderado de proteccin se pueden rechazar peticiones que el
representado s puede atender, con lo que, de hecho, se est modificando su interfaz.
________________________________________________________________________________
-8-
Coleccin de patrones
GRFICO
EDITOR DE
Dibujar()
Guardar()
Cargar()
ObtenerContorno()
DOCUMENTOS
________________________________________________________________________________
IMAGEN
REPRESENTANTE
-9Dibujar()
Guardar()
Cargar()
imagen
Dibujar()
Guardar()
Cargar()
if (imagen == 0)
imagen=CargarImagen(fichero);
imagen -> Dibujar();
Coleccin de patrones
________________________________________________________________________________
- 10 -
Coleccin de patrones
Propsito
Proporcionar a ms de un objeto la capacidad de atender una peticin, para as
evitar el acoplamiento con el que objeto que hace la peticin. Se forma con estos objetos
una cadena, en la cual cada objeto o satisface la peticin o la pasa al siguiente.
Estructura
RESPONSABLE
CLIENTE
sucesor
AtenderPeticin()
RESPONSABLE CONCRETO 1
RESPONSABLE CONCRETO 2
AtenderPeticin()
AtenderPeticin()
Cuando usarlo
Cuando una peticin puede ser atendida por ms de un objeto y el manejador que
la satisfar no se conoce a priori.
Cuando se quiere trasladar una peticin a un objeto de entre unos cuantos, sin
especificar explcitamente el receptor final.
Cuando el conjunto de objetos que pueden atender una peticin se puede
especificar o modificar dinmicamente.
Ventajas
Se reduce el acoplamiento, puesto que se libera al objeto que hace la peticin de
conocer quien se la atiende. No slo eso, sino que, adems, los miembros de la cadena
no conocen la estructura entera, sino slo su sucesor en la misma.
Mayor flexibilidad, puesto que se puede aadir o modificar la capacidad de
atender una peticin, simplemente haciendo cambios en la cadena de responsabilidades,
dinmicamente (en tiempo de ejecucin).
Inconvenientes
No se garantiza la recepcin y satisfaccin de una peticin, pues puede haber
errores en la configuracin de la cadena o tambin puede ocurrir que ningn elemento de
la cadena sepa atender la peticin.
Relacionado con
Cadena de responsabilidades se usa frecuentemente junto a Composicin, donde
lo normal es que el sucesor de un componente en la cadena sea su ancestro en la
estructura jerrquica recursiva.
________________________________________________________________________________
- 11 -
Coleccin de patrones
GESTOR DE AYUDA
________________________________________________________________________________
- 12 -
Coleccin de patrones
AtenderPeticinDeAyuda()
contexto -> AtenderPeticinDeAyuda()
APLICACIN
ELEMENTO GRFICO
DILOGO
BOTN
MostrarAyuda()
AtenderPeticinDeAyuda()
________________________________________________________________________________
- 13 -
Coleccin de patrones
COMPOSICIN / COMPOSITE
Tipo
Propsito
Permitir a los clientes tratar uniformemente a los objetos simples y compuestos de
una estructura jerrquica recursiva.
Estructura
COMPONENTE
CLIENTE
Operacin()
SIMPLE
COMPUESTO
Operacin()
Operacin()
hijos
Cuando usarlo
Cuando se pretende representar una jerarqua recursiva de objetos.
Cuando se pretende que los clientes no reparen en las diferencias entre objetos
simples y compuestos.
Ventajas
Simplifica notablemente al cliente, al no tener ste que distinguir entre objetos
simples y compuestos.
Favorece la extensibilidad, ya que es muy fcil aadir nuevos tipos de
componentes, tanto simples como compuestos.
Inconvenientes
Puede hacer el diseo peligrosamente genrico, dificultando la imposicin de
restricciones sobre ciertos componentes de la jerarqua (por ejemplo, las comprobaciones
de tipo no se pueden hacer con garanta ms que en tiempo de ejecucin). Esta es la
otra cara de la facilidad para la extensibilidad.
Relacionado con
Es frecuente que la relacin entre un componente y su padre se use para una
Cadena de Responsabilidades.
Decorador es muy frecuentemente usado junto a Composicin, como un hijo ms
del padre comn de la jerarqua (Componente), por lo que debe adaptarse a su interfaz.
________________________________________________________________________________
- 14 -
Coleccin de patrones
RECTNGULO
LNEA
TEXTO
Dibujar()
Dibujar()
Dibujar()
DIBUJO
Dibujar()
ObtenerHijo(int)
Quitar(Componente)
Aadir(Componente c)
componentes
para todos los componentes
c.Dibujar();
aadir c a la lista de
componentes;
CONSTRUCTOR / BUILDER
________________________________________________________________________________
- 15 -
Coleccin de patrones
Tipo
Propsito
Separar la construccin y la representacin de un objeto complejo, para as permitir
que el mismo proceso de construccin sirva para crear diferentes representaciones.
Estructura
constructor
DIRECTOR
Construir()
CONSTRUCTOR
ConstruirParte()
CONSTRUCTOR CONCRETO
ConstruirParte()
ObtenerResultado()
PRODUCTO
Cuando usarlo
Cuando el algoritmo de creacin del objeto complejo debe ser independiente de
qu partes y cmo lo componen.
Cuando el proceso de construccin debe soportar diferentes representaciones
para el objeto que se construye.
Ventajas
El diseo gana en flexibilidad, dado que cambiar la representacin interna del
producto que se construye es tan sencillo como definir un nuevo tipo de constructor.
Relacionado con
Como constructor de objetos complejos, este patrn es similar a Fbrica
Abstracta. La diferencia reside en que Constructor se centra en la creacin de los objetos
paso a paso (parte a parte), mientras Fbrica Abstracta est orientado a familias de
________________________________________________________________________________
- 16 -
Coleccin de patrones
________________________________________________________________________________
- 17 -
Coleccin de patrones
LECTOR RTF
constructores
CONVERSOR DE TEXTO
TraducirRTF()
ConvertirCarcter(char)
ConvertirCambioDeFuente(fuente)
ConvertirParrafo()
CONVERSOR A ASCII
CONVERSOR A TEX
ConvertirCarcter(char)
ObtenerTextoEnAscii()
ConvertirCarcter(char)
ConvertirCambioDeFuente(fuente)
ConvertirParrafo()
ObtenerTextoEnTEX()
CONVERSOR A ELEMENTOS
GRFICOS DE TEXTO
ConvertirCarcter(char)
ConvertirCambioDeFuente(fuente)
ConvertirParrafo()
ObtenerElementoGrficoDeTexto()
Texto en Ascii
Texto en TEX
________________________________________________________________________________
- 18 -
Coleccin de patrones
DECORADOR / DECORATOR
Tipo
Propsito
Aadir responsabilidades adicionales a un objeto dinmicamente, proporcionando
una alternativa flexible a la especializacin mediante herencia, cuando se trata de aadir
funcionalidades.
Estructura
COMPONENTE
Operacin()
COMPONENTE CONCRETO
DECORADOR
Operacin()
Operacin()
componente
componente -> Operacin;
Decorador::Operacin();
Comportamiento();
DECORADOR CONCRETO A
DECORADOR CONCRETO B
Comportamiento()
Operacin()
Operacin()
EstadoAnidado
Cuando usarlo
Cuando se quiere aadir responsabilidades a un objeto de manera dinmica y
transparente (independientemente de otros objetos).
Cuando es imposible la extensin de funcionalidad por herencia, por ser aquella
imprevisible en tipo y nmero.
Ventajas
Aporta una mayor flexibilidad que la herencia esttica, permitiendo, entre otras
cosas, aadir una funcionalidad dos o ms veces.
Evita concentrar en lo alto de la jerarqua clases guiadas por las
responsabilidades, es decir, que pretenden (en vano) satisfacer todas las posibilidades.
De esta forma las nuevas funcionalidades se componen de piezas simples que se crean y
se combinan con facilidad, independientemente de los objetos cuyo comportamiento
extienden.
Inconvenientes
La transparencia tiene el inconveniente de que, a pesar de ser diferentes por
muchos motivos, un decorador y un componente son indistinguibles, por lo que no se
puede confiar en la identidad de los objetos.
________________________________________________________________________________
- 19 -
Coleccin de patrones
VISTA DE UN TEXTO
DECORADOR
Dibujar()
Dibujar()
componente
componente -> Dibujar();
Decorador::Dibujar();
DibujarBorde();
5
6
BORDE
BARRA DE DESPLAZAMIENTO
DibujarBorde()
Dibujar()
Dibujar()
DesplazarHasta()
AnchoDelBorde
PosicinDeDesplazamiento
Esta es la esencia del paradigma orientado a objetos, luego no veo porque ha de ser un inconveniente.
Los autores de este catlogo parecen replantearse la bondad de Decorador y se inclinan por Estrategia.
________________________________________________________________________________
- 20 -
Coleccin de patrones
ESTADO / STATE
Tipo
Propsito
Permitir a un objeto modificar su comportamiento a medida que su estado interno
va cambiando, dando as la impresin de que el objeto cambia de clase.
Estructura
CONTEXTO
estado
ESTADO
Peticin()
Atender()
ESTADO CONCRETO A
ESTADO CONCRETO B
Atender()
Atender()
Cuando usarlo
Cuando el comportamiento de un objeto depende de su estado y debe poder
cambiar dinmicamente (en tiempo de ejecucin) dicho comportamiento, a medida que
cambie dicho estado.
Cuando las operaciones tienen definiciones largas y con mltiples condiciones,
dependientes del estado del objeto, siendo lo ms adecuado separar en objetos
independientes cada condicin atmica, para poder as combinarlas y modificarlas
independientemente, ya sea en estados ya existentes, ya en otros nuevos que se formen
combinndolos.
Ventajas
Dado que el comportamiento especfico de cada estado est autocontenido en
cada estado concreto, existe una gran flexibilidad para aadir nuevos estados y
transiciones, mediante la definicin de nuevas subclases.
A pesar de que la distribucin del comportamiento ante diferentes situaciones
entre diferentes objetos incrementa el n de clases y reduce la compacidad, es la mejor
solucin cuando hay muchos estados, pues evita las definiciones multicondicionales y
grandes, tan indeseables como los procedimientos gigantes lo son en el estilo imperativo.
Se hacen ms explcitas las transiciones entre estados que s todo estuviera
concentrado en una sola clase (esto hace ms inteligible el diseo), impidiendo adems
los estados internos inconsistentes (desde el punto de vista del contexto, los cambios de
estado son ATMICOS).
Si los objetos que representan los estados no tienen variables de instancia (esto
es, el estado est totalmente definido en su propio tipo) entonces diferentes contextos
pueden compartir estados, como PesoMosca sin estado intrnseco, slo comportamiento.
Relacionado con
________________________________________________________________________________
- 21 -
Coleccin de patrones
CONEXIN_TCP
estado
ESTADO_TCP
Abrir()
Cerrar()
MandarConfirmacin()
Abrir()
Cerrar()
MandarConfirmacin()
TCP_CONECTADO
TCP_ESCUCHANDO
TCP_CERRADO
Abrir()
Cerrar()
MandarConfirmacin()
Abrir()
Cerrar()
MandarConfirmacin()
Abrir()
Cerrar()
MandarConfirmacin()
ESTRATEGIA / STRATEGY
Estado centra su atencin en el comportamiento dependiente del estado y la aproximacin basada en tablas
en las transiciones entre estados!
________________________________________________________________________________
- 22 -
Coleccin de patrones
Tipo
Propsito
Definir una familia de algoritmos encapsulando por separado cada uno de ellos y
hacindolos, por tanto, intercambiables. Esto permite a los algoritmos variar con
independencia de los clientes que los usan.
Estructura
CONTEXTO
estrategia
ESTRATEGIA
InterfazDelContexto()
InterfazDelAlgoritmo()
ESTRATEGIA CONCRETA A
ESTRATEGIA CONCRETO B
InterfazDelAlgoritmo()
InterfazDelAlgoritmo()
Cuando usarlo
Cuando muchas clases relacionadas slo se diferencian en su comportamiento.
Cuando se necesitan diferentes variantes de un algoritmo.
Cuando un algoritmo usa datos que los clientes no tienen porque conocer.
Cuando una clase define muchos comportamientos, los cuales se manifiestan
como definiciones condicionales mltiples de sus operaciones.
Ventajas
Las familias jerrquicas de estrategias definen algoritmos y comportamientos que
enfatizan la reutilizacin. La herencia puede ayudar a sacar factor comn a la
funcionalidad de los algoritmos.
El encapsulamiento de algoritmos en clases separadas ofrece una ventajosa
alternativa a la especializacin por herencia del contexto para obtener un comportamiento
diferente, que promueve la independencia, la facilidad de entender el diseo y la
posibilidad de futuras extensiones.
Se eliminan las costosas definiciones de comportamiento multicondicionales.
Se posibilita ofrecer diferentes implementaciones del mismo comportamiento, en
funcin de restricciones como el espacio en memoria o el tiempo de respuesta.
Inconvenientes
Los clientes deben tener un cierto conocimiento de cada estrategia, para as
poder elegir en cada situacin cual es la ms apropiada.
Dado que todas las estrategias comportan una interfaz comn, si las diferencias
entre ellas es grande, es probable que mucha de la informacin que se les pasa no sea
de utilidad ms que a las ms complejas.
Puede producirse una gran explosin en el nmero de objetos del sistema. Esto
se puede aliviar si las estrategias se implementan como objetos sin estado que los
contextos pueden compartir (ver PesoMosca).
________________________________________________________________________________
- 23 -
Coleccin de patrones
Relacionado con
Los objetos Estrategia a menudo son buenos PesosMosca.
Otros aspectos de inters
Si el Contexto pasa a la Estrategia los datos como parmetros de las
operaciones de esta ltima se mantiene un acoplamiento dbil, pero la eficiencia se puede
resentir (puede que haya Estrategias que reciban datos que no necesitan). Si el
Contexto se pasa a s mismo como parmetro o la Estrategia mantiene una referencia
al Contexto se resuelve este ltimo problema a cambio de un mayor acoplamiento.
Los clientes configuran al Contexto con una Estrategia determinada, con la
cual el Contexto interacta para producir un comportamiento determinado. Para tal fin,
el Contexto puede definir una interfaz que permita a la Estrategia acceder a sus datos
internos.
Existe la posibilidad de que el Contexto defina un comportamiento por defecto y
slo en el caso de que los clientes deseen otra cosa se le configure con la Estrategia
correspondiente.
En C++, en el caso de que la Estrategia se fije en tiempo de compilacin y se
vaya a cambiar en ejecucin se pueden usar plantillas (templates) para configurar un
Contexto con una Estrategia.
Ejemplo de aplicacin
En un editor de texto pueden existir mltiples algoritmos para dividir un documento
en lineas (algoritmo simple, algoritmo TEX, algoritmo matricial, etc ...), siendo deseable
que la complejidad de los mismos quede oculta al cliente y que sea fcil y cmodo el
cambio sobre la marcha de uno por otro o la adicin de nuevos algoritmos al sistema.
algoritmo
DOCUMENTO
Recorrer()
Repaginar()
ALGORITMO
DividirEnLineas()
ALGORITMO TEX
ALGORITMO SIMPLE
ALGORITMO MATRICIAL
DividirEnLineas()
DividirEnLineas()
DividirEnLineas()
________________________________________________________________________________
- 24 -
Coleccin de patrones
Propsito
Proporcionar una interfaz para la creacin de familias de objetos interdependientes
o interrelacionados, sin especificar sus clases concretas.
Estructura
PRODUCTO
ABSTRACTO A
PRODUCTO-A2
PRODUCTO
ABSTRACTO B
CLIENTE
PRODUCTO-B2
PRODUCTO-A1
PRODUCTO-B1
FABRICA ABSTRACTA
CrearProductoA()
CrearProductoB()
FABRICA CONCRETA 1
FABRICA CONCRETA 2
CrearProductoA()
CrearProductoB()
CrearProductoA()
CrearProductoB()
Cuando usarlo
Cuando el sistema debe ser independiente de como sus productos se crean,
componen y representan.
Cuando el sistema debe configurarse con una familia de productos de entre
mltiples posibles.
Cuando se quiere dar nfasis a la restriccin de que una familia de productos ha
sido diseada para que acten todos juntos.
Cuando se quiere proporcionar una librera de clases de productos, de los que
slo se desea revelar su interfaz, no su implementacin.
Ventajas
________________________________________________________________________________
- 25 -
Coleccin de patrones
VENTANA
VENTANA MOTIF
VENTANA PM
BARRA DE DESPLAZAMIENTO
BARRA MOTIF
BARRA PM
FABRICA DE ELEMENTOS PM
CrearBarraDeDesplazamiento()
CrearBarraDeDesplazamiento()
CrearVentana()
CrearVentana()
FACHADA / FACADE
8
________________________________________________________________________________
- 26 -
Coleccin de patrones
Tipo
Propsito
Proporcionar una interfaz unificada de alto nivel que, representando a todo un
subsistema, facilite su uso. La fachada satisface a la mayora de los clientes, sin ocultar
las funciones de menor nivel a aquellos que necesiten acceder a ellas.
Estructura
Cliente2
Cliente1
Cliente3
Cliente2
Cliente1
Cliente3
FACHADA
Clase1 del
subsistema
Clase2 del
subsistema
Clase1 del
subsistema
Clase4 del
subsistema
Clase3 del
subsistema
Clase5 del
subsistema
Clase2 del
subsistema
Clase4 del
subsistema
Clase3 del
subsistema
Clase5 del
subsistema
SUBSISTEMA
DE CLASES
SUBSISTEMA
DE CLASES
Cuando usarlo
Cuando se pretende proporcionar una interfaz simple para un subsistema
complejo.
Cuando existen muchas dependencias entre los clientes y las clases que
implementan una abstraccin. Una fachada proporciona al subsistema independencia y
portabilidad.
Cuando se pretende estructurar en capas el subsistema (cada capa tendr su
propia fachada).
Ventajas
Al separar al cliente de los componentes del subsistema, se reduce el nmero de
objetos con los que el cliente trata, facilitando as el uso del subsistema.
Se promueve un acoplamiento dbil entre el subsistema y sus clientes,
eliminndose o reducindose las dependencias.
No existen obstculos para que las aplicaciones usen las clases del subsistema
que necesiten. De esta forma podemos elegir entre facilidad de uso y generalidad.
Relacionado con
________________________________________________________________________________
- 27 -
Coleccin de patrones
Compilar()
Cadena
AnalizadorLxico
Token
Smbolo
AnalizadorSintctico
CadenaEnCdigoBit
ConstructorDeNodosDePrograma
GeneradorDeCdigo
NodoDePrograma
NodoDeDefinicin
NodoDeVariable
GeneradorDeCdigo para
una Mquina de Pila
GeneradorDeCdigo para
una Mquina RISC
NodoDeExpresin
INTRPRETE / INTERPRETER
________________________________________________________________________________
- 28 -
Coleccin de patrones
Tipo
Propsito
Dado un lenguaje, define una representacin para su gramtica junto con un
intrprete que usa dicha representacin para interpretar sentencias en ese lenguaje.
Estructura
CLIENTE
EXPRESIN ABSTRACTA
Interpretar(contexto)
CONTEXTO
EXPRESIN TERMINAL
EXPRESIN NO TERMINAL
Interpretar(contexto)
Interpretar(contexto)
Cuando usarlo
Principalmente, cuando haya un lenguaje que interpretar y sus diferentes
construcciones puedan representarse mediante rboles sintcticos abstractos. Da sus
mejores resultados cuando la gramtica es simple (con gramticas complejas la jerarqua
de clases se hace inmanejable y es mejor usar generadores automticos de analizadores
sintcticos) y la eficiencia no es una cuestin vital (existen formas ms eficientes de
interpretar, usando mquinas de estado finitas en lugar de rboles sintcticos).
Ventajas
Facilidad para cambiar o extender la gramtica, mediante herencia, dado que las
diferentes reglas de la gramtica se representan con clases.
Facilidad para implementar la gramtica, dado que las implementaciones de las
clases nodo del rbol sintctico son similares, pudiendo usarse para ello generadores
automticos de cdigo.
Facilidad para introducir nuevas formas de interpretar las expresiones en la
gramtica (tener en cuenta el patrn Visitante).
Inconvenientes
Limitacin en el tipo de gramticas (y, por extensin, de problemas) para los que
sirve esta aproximacin : simples y sin grandes necesidades de eficiencia. Aunque el uso
de otros patrones puede mitigar este problema, hay circunstancias en que un Intrprete
no es lo ms apropiado.
Relacionado con
Considerado en su forma ms general (una operacin distribuida sobre una
jerarqua de clases basada en el patrn Composicin), prcticamente toda aparicin de
ste lleva unida la de un Intrprete. Pero es una cuestin de perspectiva (subjetiva!) la
que nos lleva a plantearnos un Intrprete slo cuando la jerarqua de clases (rbol
sintctico) define un lenguaje.
________________________________________________________________________________
- 29 -
Coleccin de patrones
PesoMosca ofrece una forma de compartir los smbolos terminales del rbol
sintctico.
El Intrprete puede usar un Iterador para recorrer la estructura.
Visitante puede servir para mantener el comportamiento de cada nodo del rbol
sintctico abstracto en una sola clase.
Otros aspectos de inters
Si un tipo particular de problemas se presenta frecuentemente, puede ser
provechoso expresar los diferentes casos del problema como sentencias de un lenguaje
simple.
Se puede, entonces, construir un intrprete que resuelva el problema
interpretando dichas sentencias.
Si es frecuente la creacin de nuevos intrpretes o de nuevas formas de
interpretar es mejor tener un Visitante, donde poner la operacin a realizar fuera de la
estructura de rbol.
El Cliente construye (o recibe) una estructura de instancias de Expresiones
terminales y Expresiones no terminales, ensambladas para formar un rbol sintctico
que representa la sentencia que se quiere interpretar, mientras que el Contexto contiene
informacin global para el intrprete.
A pesar de la similitud de la estructura de este patrn con la del patrn
Composicin hay sus diferencias, como que al Intrprete no le interesa como se construye
el rbol sintctico (eso es cosa del Cliente o de quien sea).
Aunque la operacin estrella es Interpretar, un Intrprete puede ser utilizado
para realizar otra serie de operaciones sobre las sentencias de un lenguaje.
Ejemplo de aplicacin
El problema de encontrar palabras que encajen en un patrn se puede resolver
definiendo un lenguaje para ello, por ejemplo mediante Expresiones Regulares. Esto
nos permite ya aplicar un Intrprete a dicho lenguaje para resolver el problema :
________________________________________________________________________________
EXPRESIN REGULAR
repeticin
- 30 -
Interpretar()
expresin2
expresin1
Coleccin de patrones
________________________________________________________________________________
- 31 -
Coleccin de patrones
ITERADOR / ITERATOR
Tipo
Propsito
Proporcionar una forma de acceder secuencialmente a los elementos de un objeto
compuesto por agregacin sin necesidad de desvelar su representacin interna.
Estructura
AGREGADO
CrearIterador()
ITERADOR
CLIENTE
Primero()
Siguiente()
Actual()
AGREGADO CONCRETO
ITERADOR CONCRETO
CrearIterador()
Primero()
Siguiente()
Actual()
Cuando usarlo
Cuando se quiere acceder a los elementos de un objeto agregado sin mostrar su
representacin interna.
Cuando se quieren permitir recorridos mltiples en objetos agregados.
Cuando se quiere proporcionar una interfaz uniforme para recorrer diferentes
estructuras de agregacin (iteracin polimrfica9).
Ventajas
Se incrementa la flexibilidad, dado que para permitir nuevas formas de recorrer
una estructura basta con modificar el iterador en uso, cambiarlo por otro
(parametrizacin!) o definir uno nuevo.
Se enfatiza la distribucin de responsabilidades (y, por ello, la simplicidad de los
elementos del sistema), dado que la interfaz del agregado se ve libre de una serie de
operaciones, ms propias de la interfaz del iterador.
Se facilitan el paralelismo y la concurrencia, puesto que, como cada iterador tiene
consciencia de su estado en cada momento, es posible que dos o ms iteradores recorran
una misma estructura simultnea o solapadamente.
Relacionado con
Iterador se aplica a menudo a estructuras recursivas del tipo de Composicin.
Los Iteradores polimrficos se basan en Mtodo de Fbrica a la hora de instanciar
el tipo de iterador apropiado a cada caso.
________________________________________________________________________________
- 32 -
Coleccin de patrones
Tambin es habitual que Iterador use un Recuerdo para capturar el estado de una
iteracin, de forma interna.
Otros aspectos de inters
Cuando el Cliente controla la iteracin se dice que el Iterador es externo y
cuando la controla el propio Iterador se dice que es interno. Los Iteradores externos
son ms flexibles y potentes, mientras que los internos son ms sencillos de usar. Los
Iteradores externos son problemticos con estructuras recursivas como las de
Composicin (se suelen usar entonces Iteradores Nulos).
Si el algoritmo para recorrer la estructura lo proporciona el agregado, el Iterador
slo guarda el estado y se le llama CURSOR (ver Recuerdo). Si el algoritmo reside en el
propio Iterador es ms fcil usar el mismo sobre estructuras diferentes o diferentes
algoritmos sobre la misma estructura, puede violarse el encapsulamiento, por necesidad
de acceder a variables privadas de la estructura.
Dada la estrecha relacin entre el Agregado y el Iterador ste puede ser una
clase amiga de aquel, sin necesidad de sobrecargar la interfaz de dicho Agregado.
Un Iterador robusto no debe verse afectado por altas y bajas en los elementos
de estructura que recorre ni necesitar hacer una copia de la misma cada vez que sta se
modifica (que los cambios se reflejen en el estado del Iterador!).
Cada AgregadoConcreto es el encargado de crear el Iterador Concreto que se
adapta a su estructura concreta (ver Mtodo de Fbrica).
Ejemplo de aplicacin
Una lista es un objeto agregado que puede beneficiarse de un Iterador que lo
recorra sin exponer su estructura interna, permitiendo as diferentes tipos de listas (listas
normales, listas de tipo skip10, ...) y diferentes tipos de iteradores.
LISTA ABSTRACTA
CrearIterador()
Contar()
Aadir(elemento)
Eliminar(elemento)
...
ITERADOR
CLIENTE
LISTA NORMAL
Primero()
Siguiente()
Actual()
SeLlegoAlFinal()
ITERADOR NORMAL
LISTA SKIP
ITERADOR SKIP
10
Una lista skip es una estructura de datos probabilstica de caractersticas similares a los rboles
balanceados.
________________________________________________________________________________
- 33 -
Coleccin de patrones
MEDIADOR / MEDIATOR
Tipo
Propsito
El diseo OO enfatiza la distribucin de responsabilidades entre objetos. Tal
distribucin puede devenir en una estructura con muchas conexiones entre objetos (en el
peor caso, todos con todos). Aunque la distribucin favorece la REUTILIZACIN, la
proliferacin de relaciones entre objetos puede ser un grave obstculo. Por ello, este
patrn define un objeto que encapsula la forma en que interactan un grupo de objetos,
promoviendo as un acoplamiento dbil al evitar las referencias explcitas entre los objetos
y permitiendo, por tanto, que su interaccin se modifique de forma independiente.
Estructura
MEDIADOR
MEDIADOR
CONCRETO
mediador
COLABORADOR
COLABORADOR
CONCRETO 1
COLABORADOR
CONCRETO 2
Cuando usarlo
Cuando existe un conjunto de objetos cuya comunicacin est bien definida pero
es compleja, con lo que las interdependencias que surgen estn poco estructuradas y son
difciles de entender.
Cuando reutilizar un objeto se ve dificultado por la cantidad de referencias que
tiene a otros objetos.
Cuando un comportamiento distribuido entre varias clases debe ser adaptable a
las circunstancias, sin tener que abusar de la especializacin por herencia.
Ventajas
Se limita el uso de la herencia, al concentrar en el Mediador un comportamiento
que, de otro modo, estara distribuido entre diversos objetos.
Modificar este
comportamiento puede requerir especializar el Mediador, pero ya no afectar a los
objetos que interactan.
Al reducir el acoplamiento entre los objetos que interactan es ms fcil variar o
reutilizar dichos objetos y el Mediador, independientemente.
Se simplifican los protocolos de comunicacin entre los objetos, al sustituir las
relaciones muchos-a-muchos por relaciones uno-a-muchos, que son ms sencillas de
entender, mantener y extender.
Al hacer de la mediacin un concepto independiente, encapsulado en un objeto
aparte, se favorece el centrar la atencin en la interaccin entre objetos, al margen del
comportamiento individual de cada uno.
Inconvenientes
________________________________________________________________________________
- 34 -
Coleccin de patrones
DIRECTOR DE DILOGO
ELEMENTO GRFICO
Cambiado()
MostrarDilogo()
CrearElementosGrficos()
ElementoCambiado(elem)
DIRECTOR DE DILOGO
BASICO
botn
BOTN
Activar()
Desactivar()
CrearElementosGrficos()
ElementoCambiado(elem)
director->ElementoCambiado(this);
CAMPO DE ENTRADA
DE DATOS
IntroducirTexto()
campo
Todos los inconvenientes de cualquier sistema centralizado son vlidos tambin en este caso.
________________________________________________________________________________
- 35 -
Coleccin de patrones
Propsito
Definir una interfaz para la creacin de un objeto, pero permitiendo a las subclases
decidir de que clase instanciarlo. Permite, por tanto, que una clase difiera la instanciacin
en favor de sus subclases.
Estructura
CREADOR
PRODUCTO
PRODUCTO CONCRETO
MtodoFbrica()
UnaOperacin()
producto = MtodoFbrica();
CREADOR CONCRETO
MtodoFbrica()
return new ProductoConcreto();
Cuando usarlo
Cuando una clase no puede adelantar las clases de objetos que debe crear.
Cuando una clase pretende que sus subclases especifiquen los objetos que ella
crea.
Cuando una clase delega su responsabilidad hacia una de entre varias subclases
auxiliares y queremos tener localizada a la subclase delegada.
Ventajas
Se gana en flexibilidad, pues crear los objetos dentro de una clase con un
Mtodo de Fbrica es siempre ms flexible que hacerlo directamente, debido a que se
elimina la necesidad de atar nuestra aplicacin unas clases de productos concretos.
Se facilitan futuras ampliaciones, puesto que se ofrece las subclases la posibilidad
de proporcionar una versin extendida de un objeto, con slo aplicar en los Productos la
misma idea del Mtodo de Fbrica.
Se facilita, en cuanto a que se hace natural, la conexin entre jerarquas de clases
paralelas, que son aquellas que se generan cuando una clase delega algunas de sus
responsabilidades en una clase aparte. Ambas jerarquas de clases paralelas son
creadas por un mismo cliente y el patrn Mtodo de Fbrica establece la relacin entre
parejas de subclases concretas en las mismas.
Inconvenientes
Se obliga al cliente a definir subclases de la clase Creador slo para crear un
producto concreto y esto puede no ser apropiado siempre12.
12
________________________________________________________________________________
- 36 -
Coleccin de patrones
Relacionado con
Fbrica Abstracta es frecuentemente implementado con Mtodo de Fbrica.
Mtodo de Fbrica habitualmente se utiliza dentro de Mtodo Plantilla.
Prototipo no requiere hacer subclases de Creador, pero s una operacin de
Inicializar en la clase Producto, que no le hace falta a Mtodo de Fbrica.
Otros aspectos de inters
MtodoFbrica puede ser algo ms que una mera declaracin del mtodo,
puede tener una implementacin genrica, por defecto. En C++, es un mtodo virtual,
generalmente puro.
Parametrizando MtodoFbrica con el tipo del producto a crear nos ahorramos
las subclases de Creador (tambin se pueden usar templates, en C++).
La filosofa que sigue el Creador es de INICIALIZACIN PEREZOSA, ya que, al
acceder al producto, si no existe todava, se crea.
Ejemplo de aplicacin
En un marco de referencia para aplicaciones que pueden presentar mltiples
documentos al usuario, no se sabe, a priori, los tipos de documentos con los que va a
trabajar cada aplicacin concreta. El marco de referencia debe, por tanto, instanciar
clases, pero slo tiene conocimiento de las clases abstractas, las cuales no pueden ser
instanciadas. La solucin est en hacer que CrearDocumento() sea un Mtodo de Fbrica que
se encargue de la fabricacin del objeto oportuno en cada situacin (es una operacin
abstracta en la clase abstracta , pero concreta y distinta en las subclases
correspondientes a cada tipo de aplicacin.
DOCUMENTO
Abrir()
Cerrar()
Guardar()
VoverAtrs()
DOCUMENTO GRFICO
docs
APLICACIN
CrearDocumento()
AbrirDocumento()
NuevoDocumento()
APLICACIN GRFICA
CrearDocumento()
return new DocumentoGrfico;
Propsito
________________________________________________________________________________
- 37 -
Coleccin de patrones
OperacinPrimitiva1();
OperacinPrimitiva2();
OperacinPrimitiva1()
OperacinPrimitiva2()
MtodoPlantilla()
CLASE CONCRETA
OperacinPrimitiva1()
OperacinPrimitiva2()
Cuando usarlo
Cuando se pretende implementar una sola vez las partes invariantes de un
algoritmo, permitiendo a las subclases implementar el comportamiento que puede variar.
Cuando se quiere sacar factor comn del comportamiento compartido por varias
clases para localizarlo en un nica clase, que evita la duplicacin de cdigo. A esta
tcnica se la conoce comnmente como REFACTORIZAR PARA GENERALIZAR y sigue
el esquema :
+ Identificar las diferencias en el cdigo ya existente.
+ Separarlas, convirtindolas en operaciones nuevas.
+ Reemplazar las diferencias en el cdigo existente por un MtodoPlantilla
que invoque a las operaciones que necesite.
Cuando se quieren controlar las extensiones de las subclases, definiendo
MtodosPlantilla que invocan operaciones adaptables (la clase abstracta da una
implementacin por defecto, que suele ser vaca, pero las subclases pueden redefinirla),
que son las que permiten extender el comportamiento.
Ventajas
Los MetodosPlantilla son una tcnica fundamental para reutilizar cdigo,
especialmente en las libreras de clases, donde son la razn de ser de la factorizacin de
comportamiento comn. Llevan a una estructura de control invertido, cuyo paradigma es
el Principio de Hollywood : <<NO NOS LLAME, YA LE LLAMAREMOS>>, esto es, la
clase padre invoca la implementacin que la clase hija hace de operaciones primitivas,
pero no al revs.
Relacionado con
Los Mtodos de Fbrica estn entre las operaciones a las que ms
frecuentemente invoca un Mtodo Plantilla, junto con operaciones concretas (tanto de la
clase abstracta como de la clase concreta), las operaciones primitivas abstractas y las
operaciones adaptables.
________________________________________________________________________________
- 38 -
Coleccin de patrones
DOCUMENTO
Abrir()
Cerrar()
Guardar()
Hacer-Leer()
docs
APLICACIN
Hacer-CrearDocumento()
AbrirDocumento()
NuevoDocumento()
________________________________________________________________________________
APLICACIN GRFICA
DOCUMENTO GRFICO
- 39 Hacer-CrearDocumento()
return new DocumentoGrfico;
Coleccin de patrones
Hacer-Leer()
________________________________________________________________________________
- 40 -
Coleccin de patrones
OBSERVADOR / OBSERVER
Tipo
Propsito
Un efecto lateral muy frecuente en aquellos sistemas que se fragmentan en un
conjunto de clases que cooperan es la necesidad de mantener la consistencia entre los
distintos objetos interrelacionados. Para no recurrir a soluciones fuertemente acopladas
(que reducen la posibilidad de reutilizacin), este patrn define una dependencia uno-amuchos entre objetos, para que, cuando uno de ellos cambie su estado, todos los que
dependan de l sean avisados y puedan actualizarse convenientemente.
Estructura
ASUNTO
Ligar(Observador)
Desligar(Observador)
Notificar()
ASUNTO CONCRETO
FijarEstado()
ObtenerEstado()
observadores
OBSERVADOR
Actualizar()
asunto
EstadoDelObservador =
asunto -> ObtenerEstado();
return EstadoDelAsunto;
OBSERVADOR
CONCRETO
Actualizar()
EstadoDelObservador
EstadoDelAsunto
Cuando usarlo
Cuando una abstraccin presenta dos aspectos, un dependiente del otro.
Encapsular estos aspectos en objetos separados nos permite variar y reutilizarlos
independientemente.
Cuando un cambio en un objeto requiere cambiar otros objetos y no sabemos
cuntos exactamente lo necesitarn.
Cuando un objeto debe poder notificar sus cambios a otros objetos, sin necesidad
de saber nada acerca de su identidad (acoplamiento dbil).
Ventajas
Dado que el Asunto no conoce la clase de Observadores que tiene, el
acoplamiento que existe es mnimo y abstracto. Por ello, tanto unos como otros pueden
variar y evolucionar en diferentes niveles de detalle de forma independiente.
Se facilita y simplifica el radiado de las notificaciones. El Asunto slo tiene que
comunicar los cambios; luego, cada Observador es libre para hacer o no caso. Esto
permite gran libertad a la hora de dar de alta o baja a los Observadores.
Inconvenientes
Dado el desconocimiento que unos Observadores tienen de los otros, cualquier
operacin aparentemente inofensiva puede originar una cascada de costosas
actualizaciones. Adems, sin un protocolo preciso, en el que se especifique lo que
cambia, el esfuerzo se multiplica.
________________________________________________________________________________
- 41 -
Coleccin de patrones
Relacionado con
Un Gestor de Cambios que encapsula la semntica de actualizaciones en las
relaciones complejas entre Asuntos y Observadores acta como Mediador.
Un Gestor de Cambios puede usar el patrn Solitario para hacerse nico y
globalmente accesible.
Otros aspectos de inters
La forma ms simple de implementar las relaciones entre Asuntos y
Observadores es mantener referencias explcitas y directas, lo cual puede resultar
prohibitivo. Otra opcin es utilizar una tabla hash que tiene el inconveniente de
complicar el acceso. Cuando la relacin entre Asuntos y Observadores es compleja se
puede definir un Gestor de Cambios (ver Mediador) que mantiene las referencias entre
unos y otros, define una poltica de actualizaciones coherente y la pone en prctica con
cada cambio en un Asunto que lo requiera.
Hay que asegurarse de que las operaciones que cursan notificaciones lo hacen
una vez que el estado es consistente despus del cambio, nunca antes (ver Mtodo
Plantilla), luego LA NOTIFICACIN DEBE SER SIEMPRE LO LTIMO.
Aunque es frecuente que sea un Observador el que origina el cambio en el
Asunto, dicho Observador se suele esperar hasta que llega la notificacin del Asunto
para actualizar su propio estado. Si se contempla la posibilidad de observar a ms de un
Asunto, Actualizar debe parametrizarse para saber a cual se refiere el cambio.
Si la Notificacin corre a cargo del propio Asunto se simplifica la tarea al
cliente, pero puede ser ineficiente (muchas actualizaciones). La opcin contraria, permite
juntar en una sola varias actualizaciones, pero complica la tarea del cliente.
Para evitar las referencias colgadas cuando un Asunto desaparece, ste debe
notificarlo a sus Observadores para que estos puedan inutilizar sus referencias. La
notificacin puede ser muy detallada (modelo PUSH) o un simple aviso, que el
Observador completa pidiendo la informacin que le interese (modelo PULL).
Para mejorar la eficiencia, el Asunto puede tener constancia de ciertos
Observadores interesados en ciertos eventos, avisndolos slo a ellos cuando ocurren.
Algunos lenguajes (Smalltalk) no permiten herencia mltiple y favorecen la unin
de Asuntos y Observadores, en lugar de separarlos en clases y objetos diferentes.
Ejemplo de aplicacin
Un RelojDigital y un RelojAnalgico observan como cambia el estado de un
Temporizador y se actualizan de acuerdo con dichos cambios de estado.
ASUNTO
observadores
OBSERVADOR
Notificar()
TEMPORIZADOR
Actualizar()
asunto
RELOJ ANALGICO
RELOJ DIGITAL
Actualizar()
Actualizar()
PulsoDeReloj()
asunto
________________________________________________________________________________
- 42 -
Coleccin de patrones
Tipo
Propsito
Mejorar la eficiencia a la hora de mantener una gran cantidad de objetos de grano
fino, usando la idea de la comparticin. Un PesoMosca es un objeto compartido que
puede ser usado en diferentes contextos simultneamente, de forma transparente,
indistinguible. El concepto clave aqu es la distincin entre el ESTADO INTRNSECO
(informacin independiente del contexto del objeto, almacenada en el mismo y que
favorece su comparticin) y el ESTADO EXTRNSECO (informacin que depende y vara
con el contexto donde se use el objeto, no puede ser compartida y se la proporciona el
cliente que lo usa, a travs de la fbrica) del objeto compartido.
Estructura
FBRICA DE PESOS MOSCA
PesosMosca
PESOMOSCA
ObtenerPesoMosca(clave)
Si existe PesoMosca(clave)
return PesoMoscaExistente;
en otro caso {crearlo;
aadirlo al grupo;
return PesoMoscaNuevo;}
Operacin(EstadoExtrnseco)
PESOMOSCA CONCRETO
PESOMOSCA CONCRETO
Operacin(EstadoExtrnseco)
NO COMPARTIBLE
Operacin(EstadoExtrnseco)
EstadoIntrnseco
EstadoCompleto
CLIENTE
Cuando usarlo
Cuando sea cierto que :
La aplicacin usa un gran nmero de objetos.
Los costes de almacenamiento son prohibitivos como consecuencia de lo anterior.
La mayor parte del estado del objeto puede considerarse extrnseco.
Muchos grupos de objetos pueden reemplazarse por unos pocos objetos
compartidos una vez que se ha prescindido del estado extrnseco.
La aplicacin no depende de la identidad de los objetos, difuminada como
consecuencia de la comparticin de los mismos.
Ventajas
Mejora en la eficiencia, sobre todo en relacin con el ahorro en el
almacenamiento, que aumenta paralelamente con la comparticin de objetos y es funcin
de :
(a) la reduccin en el n total de instancias.
(b) la cantidad de estado intrnseco por objeto.
(c) si el estado extrnseco es computado (calculado) o almacenado.
Inconvenientes
Se introducen costes en tiempo de ejecucin asociados a las transferencias,
bsquedas y/o computacin del estado extrnseco (y su almacenamiento).
________________________________________________________________________________
- 43 -
Coleccin de patrones
Relacionado con
PesoMosca se combina habitualmente con Composicin para implementar
estructuras jerrquicas lgicas en trminos de grafos acclicos dirigidos con nodos hoja
compartidos. Como consecuencia de la comparticin un nodo hoja no puede tener un
puntero a su padre (ambigedad, pues tiene varios), si no que ste se le pasa como parte
del estado extrnseco.
Suele ser muy ventajoso implementar Estado y Estrategia como PesosMosca.
Otros aspectos de inters
Eliminar el EstadoExtrnseco de los objetos compartidos puede no reducir los
costes de almacenamiento si resultan ser tan variados como los propios objetos.
La FbricaDePesosMosca es quien gestiona y controla las clases compartibles,
permitiendo a los clientes el acceso (indirecto) a las mismas. Suele usar almacenamiento
asociativo para facilitar a los clientes el acceso a los objetos compartidos de su inters (si
el n de stos es grande y/o variable se pueden necesitar tcnicas de cuenta de
referencias o recoleccin de basura para eliminarlos y recuperar el espacio ocupado).
Los PesosMoscaConcretosNoCompartibles en una jerarqua recursiva pueden
tener hijos que s sean para compartir. Adems tenerlos inmersos en dicha jerarqua
recursiva, junto a los que si se comparten, puede facilitar en el futuro hacerlos tambin a
ellos compartibles, si se considera oportuno o necesario.
El Cliente proporciona a las clases compartibles el EstadoExtrnseco que les
falta, pero siempre a travs de la FbricaDePesosMosca, NUNCA DIRECTAMENTE.
Ejemplo de aplicacin
En un editor de documentos podemos tener una jerarqua recursiva de elementos
grficos, tales como filas, columnas, caracteres, etc ... algunos de los cuales tendr
sentido hacer compartibles, por motivos de eficiencia. Tal es el caso de los caracteres. Si
por cada carcter del documento creamos un objeto los problemas de almacenamiento
aparecern de inmediato, mientras que stos se resolvern fcilmente si slo se crea un
objeto por cada tipo distinto de carcter (256, en ASCII), compartible por cada aparicin
de los mismos en el texto, en diferentes posiciones (este sera su estado extrnseco).
ELEMENTO GRFICO
Dibujar(Contexto)
Intersectar(Punto,Contexto)
hijos
FILA
CARCTER
COLUMNA
Dibujar(Contexto)
Intersectar(Punto,Contexto)
Dibujar(Contexto)
Intersectar(Punto,Contexto)
Dibujar(Contexto)
Intersectar(Punto,Contexto)
hijos
char c
PROTOTIPO / PROTOTYPE
Tipo
Propsito
________________________________________________________________________________
- 44 -
Coleccin de patrones
Especificar los tipos de objetos que queremos crear usando una instancia
prototpica y crear nuevos objetos copiando dicho prototipo.
Estructura
CLIENTE
prototipo
PROTOTIPO
Operacin()
p = prototipo->Clonar();
return
(copia de si mismo);
Clonar()
PROTOTIPO
PROTOTIPO
CONCRETO 1
Clonar()
CONCRETO 2
Clonar()
return
(copia de si mismo);
Cuando usarlo
Cuando el sistema debe ser independiente de como se crean, componen y
representan sus productos .... (y)
Cuando las clases a instanciar se especifican en tiempo real o se quiere evitar
construir una jerarqua de fbricas paralela a la de productos o las instancias de una clase
pueden tomar una de entre unas pocas combinaciones distintas de estado.
Ventajas
Potencia el encapsulamiento, ya que, al igual que Fbrica Abstracta y Constructor,
oculta al cliente las clases de productos concretos con los que trabaja.
Dota al sistema de una mayor flexibilidad, pues se pueden aadir/eliminar
productos concretos dinmicamente13.
Se pueden definir nuevos tipos de objetos instanciando clases ya existentes y
registrando estas instancias como nuevos prototipos para el cliente. Por tanto, se pueden
definir nuevas clases SIN PROGRAMAR NADA.
Se reduce drsticamente la especializacin mediante herencia, lo cual siempre
ayuda a la reutilizacin. En C++, esto es especialmente til puesto que no hay
metaclases, con lo cual las clases no son objetos de primer orden y tampoco hay
informacin de tipos en tiempo de ejecucin.
Permite configurar una aplicacin en tiempo de ejecucin (aadir/eliminar clases
dinmicamente).
Inconvenientes
Cada subclase de Prototipo debe implementar la operacin Clonar y esto
puede resultar difcil en clases que ya existen o que incluyen objetos que no admiten la
copia o que contienen referencias circulares.
Relacionado con
Prototipo y Fbrica Abstracta son patrones rivales en muchos sentidos, aunque
tambin pueden trabajar juntos, cooperando.
13
________________________________________________________________________________
- 45 -
Coleccin de patrones
Aquellos diseos que hacen un uso muy acentuado de los patrones Composicin
y Decorador frecuentemente pueden beneficiarse tambin del patrn Prototipo.
Otros aspectos de inters
La operacin Clonar puede ser conflictiva, pues el constructor que se utilice para
hacer la copia debe asegurar la independencia total con respecto al original (esto incluye
el no compartir estructuras, por ejemplo).
Prototipo puede requerir una operacin para inicializar.
Ejemplo de aplicacin
Para hacer un editor de msica podemos adaptar un marco de referencia para
editores grficos en general, aadiendo las clases de elementos grficos que necesitemos
como las notas, los silencios o el pentagrama. El problema surge cuando, como
frecuentemente ocurre, dicho marco de referencia proporciona una paleta de
herramientas para manipular los elementos grficos (aadir, seleccionar, mover, etc ...),
puesto que dichas herramientas, al no conocer estas clases especficas de elementos
grficos, no saben como crearlos. La solucin est en hacer que las herramientas creen
cualquier elemento grfico mediante copia o clonacin de una instancia de una subclase
de la clase abstracta y general que representa dichos elementos grficos. Dicha instancia
recibe el nombre de prototipo.
prototipo
HERRAMIENTA
Manipular()
ELEMENTO GRFICO
Dibujar(posicin)
Clonar()
HERRAMIENTA GRFICA
PENTAGRAMA
NOTA
PENTAGRAMA
Manipular()
Dibujar(posicin)
Clonar()
Dibujar(posicin)
Clonar()
Dibujar(posicin)
Clonar()
return
(copia de si mismo);
return
(copia de si mismo);
return
(copia de si mismo);
p = prototipo->Clonar();
while (usuario mueva el ratn)
p->Dibujar (nueva_posicin);
insertar p en el dibujo;
PUENTE / BRIDGE
Tipo
Propsito
Separar una abstraccin de su implementacin para permitir que ambos puedan
variar independientemente.
________________________________________________________________________________
- 46 -
Coleccin de patrones
Estructura
ABSTRACCIN
imp
Operacin()
ABSTRACCIN
REFINADA
imp->Implementacin();
IMPLEMENTACIN
CLIENTE
Implementacin()
IMPLEMENTACIN
IMPLEMENTACIN
CONCRETA 1
Implementacin()
CONCRETA 2
Implementacin()
Cuando usarlo
Cuando se quiere evitar una unin permanente entre abstraccin e
implementacin.
Cuando se quiere extender tanto abstraccin como implementacin por herencia.
Cuando se quiere evitar que posibles cambios en la implementacin de una
abstraccin afecten a los clientes.
Cuando se quiere ocultar la implementacin de la vista de los clientes.
Cuando se tiene que hacer frente a una proliferacin de clases tal que el uso de la
herencia no es recomendable por su inflexibilidad.
Cuando se quiere tener muchos objetos compartiendo una misma implementacin
de manera transparente al cliente (se usan mecanismos de cuenta de referencias).
Ventajas
La separacin entre interfaz e implementacin permite configurar (y cambiar) esta
relacin dinmicamente, en tiempo de ejecucin (y no de compilacin). Adems, esta
independencia favorece una mejor estructuracin en niveles del sistema.
La citada independencia de variacin repercute en una mayor extensibilidad.
Se favorece el encapsulamiento, al ocultarse a los clientes detalles referentes a la
implementacin, como la comparticin de implementaciones, por ejemplo.
Relacionado con
Fbrica Abstracta puede servir para crear y configurar un Puente en concreto.
Adaptador trabaja con sistemas ya diseados, tratando de hacer compatibles
clases con diferentes interfaces, mientras que Puente realiza su misin durante la fase de
diseo, posibilitando que abstracciones e implementaciones varen independientemente.
Otros aspectos de inters
Al contrario que Adaptador, Puente no puede construirse usando herencia mltiple
(pblica para la interfaz y privada para la implementacin) porque esto ligara de forma
permanente una implementacin a una abstraccin (al menos en C++, que tiene herencia
esttica).
Abstraccin puede conocer todas las ImplementacionesConcretas y elegir una
o puede tener una por defecto o puede delegar la decisin en una Fbrica Abstracta.
Si slo hay una implementacin, la clase base de la jerarqua de
implementaciones puede no ser necesaria, pero la separacin entre abstraccin e
implementacin s, porque garantiza la independencia.
________________________________________________________________________________
- 47 -
Coleccin de patrones
Ejemplo de aplicacin
En una Interfaz Grfica de Usuario (GUI) lo normal es tratar de permitir que los
distintos elementos grficos (una ventana, por ejemplo) se adapten a los diferentes
contextos en que deben ser usados y a las diferentes plataformas hardware sobre las que
pueden funcionar. As, no ser lo mismo una ventana en el sistema Xwindows que en el
sistema Presentation Manager (PM). Y siempre podemos querer especializar el elemento
grfico genrico (la ventana) para adecuarnos mejor a ciertas circunstancias concretas
(no es lo mismo una ventana para albergar iconos que una ventana temporal, para
acontecimientos transitorios como una ayuda en lnea o una solicitud de introduccin de
datos por el usuario). Por tanto, puede ser de mucha utilidad (sobre todo pensando en
futuras ampliaciones) separar los aspectos de interfaz de los de implementacin.
puente
imp
VENTANA
IMPLEMENTACIN DE
VENTANA
DibujarTexto()
DibujarCuadro()
VENTANA PARA
ICONOS
DibujarBorde()
ImplementaDibujarTexto()
ImplementaDibujarLinea()
imp->ImplementaDibujarLinea();
imp->ImplementaDibujarLinea();
imp->ImplementaDibujarLinea();
imp->ImplementaDibujarLinea();
DibujarCuadro();
DibujarTexto();
IMPLEMENTACIN DE
IMPLEMENTACIN DE
VENTANA XWINDOW
VENTANA PM
ImplementaDibujarTexto()
ImplementaDibujarLinea()
ImplementaDibujarTexto()
ImplementaDibujarLinea()
XDibujarTexto();
XDibujarLinea();
RECUERDO / MEMENTO
Tipo
Propsito
Capturar y exteriorizar el estado interno de un objeto, sin violar el encapsulamiento,
para que dicho objeto pueda restaurar este estado en el futuro, si lo desea.
Estructura
recuerdo
CUIDADOR
ORIGINADOR
RECUERDO
________________________________________________________________________________
- 48 -
Coleccin de patrones
FijarRecuerdo(Recuerdo r)
CrearRecuerdo()
estado
ObtenerEstado()
FijarEstado()
estado
estado = r -> ObtenerEstado();
Cuando usarlo
Cuando sea necesario registrar una instantnea (o parte de ella) del estado
interno de un objeto para permitir posteriores restauraciones de dicho estado registrado y,
adems, exista el peligro de que una interfaz directa, abierta sobre el propio objeto,
pueda exponer detalles de implementacin del mismo, rompiendo as el encapsulamiento.
Ventajas
Se salvaguarda el encapsulamiento, impidiendo la exposicin pblica de
informacin que slo el Originador debe manejar, pero que, por otra parte, puede (y
debe) almacenarse fuera del mismo.
Se simplifica al objeto Originador, que en otros diseos posibles, que tambin
preservaran el encapsulamiento, tendra que hacerse cargo del mantenimiento de todas
las versiones del estado interno en que los clientes estuvieran interesados.
Inconvenientes
El uso de Recuerdos puede convertirse en inapropiado, por el excesivo consumo
de recursos, en el caso de que la informacin que el Originador deba almacenar en el
Recuerdo sea considerable o las peticiones de los clientes solicitando Recuerdos sea
demasiado frecuente.
Puede resultar problemtico en ciertos lenguajes el mantenimiento de dos
interfaces distintas (amplia para el Originador y estrecha para el Cuidador) para
acceder al Recuerdo.
Puede haber costes ocultos en el cuidado de los Recuerdos, pues los
Cuidadores son los responsables de eliminar los Recuerdos que vigilan, pese a no
conocer sus interioridades, lo cual dificulta su labor.
Relacionado con
Accin puede usar Recuerdo para mantener el estado en aquellas operaciones
que se pueden deshacer (cambios de estado incrementales).
Iterador puede ser sustituido o implementado en trminos de Recuerdo, dado que
una interfaz para iteraciones basada en Recuerdos permite que ms de una iteracin se
haga simultnea o solapadamente (cosa que ya permite Iterador) y adems no rompe el
encapsulamiento de la coleccin que se recorre (el Recuerdo slo es interpretada por la
propia coleccin de objetos que se recorre, nadie ms tiene acceso a ella).
Otros aspectos de inters
El Recuerdo tiene dos interfaces distintas : el Cuidador ve una interfaz
estrecha que slo le permite pasar el Recuerdo a otros objetos y el Originador ve una
interfaz amplia que le permite acceder a los datos necesarios y hacer todas las
manipulaciones necesarias para restaurar un estado almacenado.
________________________________________________________________________________
- 49 -
Coleccin de patrones
RESOLUTOR DE
RESTRICCIONES
EDITOR
sol
ObtenerEstado()
FijarEstado()
estado
FijarRecuerdo(Recuerdo r)
CrearRecuerdo()
recuerdo
HacerMover()
DeshacerMover()
estado
return new Recuerdo(estado);
SOLITARIO / SINGLETON
Tipo
Propsito
Garantizar que una clase slo tiene una nica instancia, proporcionando un punto
de acceso global a la misma.
Estructura
SOLITARIO
return Instancianica;
static Instancia()
OperacinDelSolitario()
ObtenerDatosDelSolitario()
________________________________________________________________________________
- 50 -
Coleccin de patrones
static Instancianica
DatosDelSolitario
Cuando usarlo
Cuando debe haber nicamente una instancia de una clase y debe ser claro su
acceso para los clientes.
Cuando la Instancianica debe ser especializable mediante herencia y los
clientes deben poder usar la instancia extendida sin modificar su cdigo (el de los
clientes).
Ventajas
El acceso a la Instancianica est ms controlado.
Se reduce el espacio de nombres (frente al uso de variables globales).
Permite refinamientos en las operaciones y en la representacin, mediante la
especializacin por herencia de Solitario.
Es fcilmente modificable para permitir ms de una instancia y, en general, para
controlar el nmero de las mismas (incluso si es variable).
Es ms flexible que la alternativa de las operaciones de clase, adems de que
stas (en C++), al ser funciones miembro estticas, no son virtuales, luego no pueden ser
especializadas mediante herencia ni redefinidas polimrficamente.
Relacionado con
Muchos otros patrones pueden implementarse haciendo uso de Solitario. Por
ejemplo : Fbrica Abstracta, Constructor y Prototipo.
Otros aspectos de inters
El mtodo Instancia es el punto de acceso a la Instancianica del Solitario
para los clientes. Lo que ocurre en realidad con este mtodo es que, si Instancianica
no ha sido an creada, la crea (INICIALIZACIN PEREZOSA) llamando al constructor
Solitario, que no es pblico.
Ejemplo de aplicacin
Son numerosos los ejemplos de clases de objetos que deben tener una nica
instancia. As, aunque un sistema tenga muchas impresoras, debe haber slo un
spooler. Debe haber, tambin, un nico sistema de ficheros y un nico gestor del
sistema de ventanas. Un filtro digital tendr slo un conversor A/D. Tomemos este ltimo
como ejemplo :
FILTRO DIGITAL
conversor
CONVERSOR A/D
Filtrar()
public :
static Conversor* Instancia()
protected :
Conversor()
if (Instancianica == 0)
Instancianica = new Conversor;
return Instancianica;
private :
static Conversor* Instancianica
________________________________________________________________________________
- 51 -
Coleccin de patrones
________________________________________________________________________________
- 52 -
Coleccin de patrones
VISITANTE / VISITOR
Tipo
Propsito
Representar una operacin que est pensada para ser aplicada sobre los
elementos de una estructura de objetos, permitiendo as definir y aadir un nuevo
comportamiento sin necesidad de cambiar las clases de los elementos de la estructura de
objetos.
Estructura
CLIENTE
ELEMENTO
Aceptar(Visitante)
ESTRUCTURA
DE OBJETOS
VISITANTE
VisitarElementoA(ElementoA)
VisitarElementoB(ElementoB)
ELEMENTO A
ELEMENTO B
VISITANTE CONCRETO 1
VISITANTE CONCRETO 2
OperacinA()
Aceptar(Visitante v)
OperacinB()
Aceptar(Visitante v)
VisitarElementoA(ElementoA)
VisitarElementoB(ElementoB)
VisitarElementoA(ElementoA)
VisitarElementoB(ElementoB)
v->VisitarElementoA(this);
v->VisitarElementoB(this);
Cuando usarlo
Cuando una Estructura De Objetos contiene muchas clases con diferentes
interfaces y se quieren aadir operaciones a dichos objetos en funcin de la interfaz.
Cuando se quieren aadir a los objetos de una estructura operaciones muy
diferentes y sin relacin alguna entre ellas, sin necesidad de hacerlo a nivel individual.
Cuando las clases que definen la Estructura De Objetos casi nunca cambian,
pero frecuentemente queremos aadir nuevas operaciones a ciertos objetos de la
estructura.
Ventajas
Es fcil aadir nuevas operaciones a la Estructura De Objetos; slo hay que
crear un nuevo Visitante, en vez de cambiar todas las clases a las que queremos que
afecte.
Se juntan las operaciones relacionadas entre s, separndose las que nada tienen
que ver. Esto simplifica tanto las clases de los Elementos como los algoritmos definidos
en los Visitantes.
Se pueden recorrer jerarquas formadas por objetos de distintos tipos (distinta
clase padre), mientras que un Iterador no puede hacer esto.
Se puede ir acumulando el estado a medida que se recorre la estructura, en vez
de tener que pasarlo como parmetro o guardarlo en variables globales.
Inconvenientes
________________________________________________________________________________
- 53 -
Coleccin de patrones
NODO
Aceptar(VisitanteDeNodo)
VISITANTE DE NODO
VisitarAsignacin(NodoAsignacin)
VisitarVariable(NodoVariable)
PROGRAMA
NODO_ASIGNACIN
NODO_VARIABLE
VISITANTE_COMPR_TIPOS
VISITANTE_GEN_CODIGO
Aceptar(Visitante v)
Aceptar(Visitante v)
VisitarAsignacin(NodoAsignacin)
VisitarVariable(NodoVariable)
VisitarAsignacin(NodoAsignacin)
VisitarVariable(NodoVariable)
v->VisitarAsignacin(this);
v->VisitarVariable(this);
________________________________________________________________________________
- 54 -