View-Handler

Pattern Oriented Software Architecture
View-Handler
Jamir Antonio Avila Mojica
César Julio Bustacara Medina
Patrones de Software
Agenda
Introducción
View-Handler
Ejemplo
Contexto
Problema
Solución
Estructura
Dinámica
Implementación
Variantes
Usos conocidos
Consecuencias
View Handler
• El patrón de diseño View Handler ayuda a administrar todas
las vistas que proporciona un sistema de software. Un
componente view handler permite a los clientes abrir,
manipular y disponer las vistas. También coordina las
dependencias entre ellas y orquesta su actualización.
Ejemplo
• Muchos editores de múltiples documentos permiten trabajar
simultáneamente con varios documentos; cada documento
se muestra en su propia ventana.
Para usar efectivamente tales editores, los usuarios
necesitan funcionalidad que les permita administrar tales
ventanas. Por ejemplo, pueden querer clonar una ventana
para trabajar con vistas independientes del mismo
documento. Además, los usuarios no acostumbran cerrar
las ventanas antes de salir del editor. Es tarea del sistema
mantener la pista de todos los documentos abiertos y
cerrarlos apropiadamente.
Ejemplo
Ejemplo
• Así mismo, los cambios en una ventana pueden afectar a
otras. Se requiere entonces de un mecanismo eficiente para
propagar los cambios entre ventanas.
Contexto
• Un sistema de software que proporciona múltiples vistas de
datos específicos de una aplicación, o que permite trabajar
con múltiples documentos.
Problema
• Los sistemas de software que soportan múltiples vistas con
frecuencia necesitan de funcionalidad adicional para
administrarlas. Los usuarios quieren abrir, manipular, y
disponer de las vistas y sus contenidos con facilidad. Las
vistas deben estar coordinadas para que la actualización en
una de ellas se propague automáticamente a las vistas
relacionadas.
Problema
Fuerzas que gobiernan la solución de este problema:
– Administrar múltiples vistas debe ser fácil desde la
perspectiva del usuario, y también para los componentes
cliente del sistema.
– Las implementaciones de vistas individuales no dependen de
las otras ni están mezcladas con el código usado para
administrar las vistas.
– Las implementaciones de las vistas pueden variar, y tipos
adicionales de vistas se pueden adicionar durante la vida del
sistema.
Solución
• Separe la administración de las vistas del código requerido
para presentar o controlar vistas específicas.
Un componente view handler administra todas las vistas que
el sistema proporciona. Además, ofrece la funcionalidad
necesaria para abrir, coordinar, cerrar vistas específicas, y
también para organizarlas. Por ejemplo, una opción que
permita disponer las vistas en un orden específico.
Vistas específicas, junto con la funcionalidad para su
presentación y control, son encapsuladas en componentes
vista independientes – uno para cada tipo de vista. Suppliers
proporcionan vistas con los datos que deben presentar.
Solución
• El patrón Value Handler adapta la idea, propuesta por el
patrón MVC, de separar la presentación de la funcionalidad
central. Por sí solo no proporciona una estructura completa
para el sistema, sino que remueve la responsabilidad de
administrar las vistas y sus dependencias mutuas del
modelo y de los componentes vista. El patrón asigna esta
responsabilidad al administrador de vistas. Por ejemplo, una
vista no necesita manejar sus subvistas. El patrón View
Handler es de granularidad más fina que el patrón ModelView-Controller – ayuda a refinar las relaciones entre el
modelo y sus vistas asociadas.
Solución
Se puede considerar al componente view handler como un
Abstract Factory y como un Mediator. Es un Abstract Factory
puesto que los clientes son independientes de cómo son
creadas las vistas específicas; es un Mediator porque los
clientes no tienen conocimiento de cómo se coordinan las
vistas.
Solución
En
Enelelejemplo
ejemplodel
deleditor
editorde
dedocumentos,
documentos,hay
hayun
uncomponente
componentevista
vista
por
porcada
cadatipo
tipode
deventana
ventanaasociada
asociadacon
conun
undocumento.
documento.El
Elsistema
sistema
proporciona
proporcionaventanas
ventanaspara
paraeditar
editardocumentos,
documentos,para
paraprevisualizar
previsualizarlala
salida
salidaimpresa,
impresa,yypara
paraver
verimágenes
imágenespreliminares
preliminarespequeñas
pequeñasde
delas
las
páginas.
páginas.Un
Unview
viewhandler
handleradministra
administraestas
estasvistas.
vistas.Además
Ademásde
delala
creación
creaciónyyeliminación
eliminaciónde
devistas,
vistas,elelview
viewhandler
handlerofrece
ofrecefunciones
funciones
que
quepasan
pasanaaprimer
primerplano
planouna
unaventana,
ventana,para
paraclonarla,
clonarla,yytambién
también
puede
puedeacomodar
acomodarlas
lasventanas
ventanaspara
paraque
queno
nose
setraslapen
traslapencomo
comoen
enun
un
mosaico.
mosaico.Los
Losproveedores
proveedoresde
delas
lasventanas
ventanasson
sonlos
losdocumentos
documentosaa
desplegar.
desplegar.Se
Sepueden
puedentener
tenermúltiples
múltiplesvistas
vistassimultáneas
simultáneasde
deun
un
documento,
documento,yytambién
tambiénse
sepueden
puedenvisualizar
visualizarmúltiples
múltiplesdocumentos.
documentos.
Estructura
• El view handler es el componente central del patrón. Es
responsable de abrir nuevas ventanas, y los clientes pueden
especificar la vista que quieren. El view handler instancia el
componente vista correspondiente, se asegura de su
correcta inicialización, y pide a la nueva vista que se
muestre. Si la vista solicitada ya está abierta, el view handler
la trae a primer plano. Si la vista solicitada está abierta pero
minimizada, el view handler pide a la vista que se
despliegue de tamaño regular.
Estructura
El view handler también ofrece funciones para cerrar vistas
individuales o todas las vistas abiertas, como sea requerido por
la aplicación cuando se cierre.
Sin embargo, la principal responsabilidad del view handler,
es ofrecer servicios de administración de vistas. Ejemplos
incluyen funciones para traer rápidamente una vista específica
a primer plano, acomodar vistas, dividir vistas individuales en
partes, refrescar las vistas, y clonar las vistas para
proporcionar varias vistas del mismo documento. Tal
funcionalidad de administración puede ser difícil de organizar si
su implementación abarcara muchos componentes vista
diferentes.
Estructura
CRC de la clase View Handler
Estructura
• Una responsabilidad adicional del view handler es la
coordinación. Puede haber dependencias entre vistas como
sucede si varias vistas presentan diferentes partes de un
documento compuesto. Tales vistas deben ser colocadas al
lado unas de otras cuando son organizadas las ventanas. Si
un usuario modifica una vista del documento, puede ser
necesario actualizar las otras en un orden predefinido. Por
ejemplo, las vistas que muestran la información más global
deberían ser actualizadas en primer lugar.
Estructura
• Un componente abstract view define una interfaz que es
común a todas las vistas. El view handler usa esta interfaz
para crear, coordinar y cerrar las vistas. La plataforma en la
que el sistema corre usa la interfaz para ejecutar eventos del
usuario: como cambiar el tamaño de una ventana. La
interfaz abstract view debe ofrecer la correspondiente
función para todas las posibles operaciones que pueden ser
ejecutadas en una vista.
Estructura
• Componentes specific view son derivados de abstract view
e implementan esta interfaz. Adicionalmente, cada vista
implementa su propia función de presentación. Recupera los
datos del proveedor de la vista, prepara los datos para ser
presentados, y los muestra al usuario. La función de
presentación es invocada cuando se abre o actualiza una
vista.
Estructura
CRC de las clases Abstract View y Specific View
Estructura
• Componentes Supplier proporcionan los datos que son
presentados por los componentes vista. Estos Suppliers
ofrecen una interfaz que permite a los clientes – las vistas –
recuperar y cambiar los datos. Notifican a componentes
dependientes sobre los cambios en su estado interno. Tales
componentes dependientes son vistas individuales o, en el
caso donde el view handler organice las actualizaciones, el
view handler.
Estructura
Diagrama CRC de la clase Supplier
Estructura
Diagrama de clases OMT del patrón View Handler
Dinámica
Diagrama de secuencia del escenario 1
Implementación
La implementación de una estructura View Handler se puede
dividir en cuatro pasos. Se parte de que existen los
proveedores, e incluyen un mecanismo de propagación de
cambios.
1. Identifique las vistas. Especifique los tipos de vistas a ser
proporcionados y como controla el usuario cada vista individual.
Implementación
2. Especifique una interfaz común para todas las vistas. Incluya
funciones para abrir, cerrar, presentar, actualizar, y manipular
una vista. La interfaz puede ofrecer una función para inicializar
una vista, que puede ser usada para configurar una vista con
datos de un proveedor particular. Encapsule la interfaz en una
clase abstracta, es posible proveer una implementación
predefinida para algunas funciones.
Implementación
3. Implemente las vistas. Derive una clase a partir de la clase
AbstractView para cada tipo específico de vista identificado en el
paso 1. Implemente las partes de la interfaz específicas a la
vista, como el método displayData(). Sobreponga aquellos
métodos para los cuales la implementación predefinida no sea
suficiente.
Si el view handler implementa políticas específicas de
coordinación y actualización, las vistas deben notificar aquellos
eventos que puedan afectar a otras vistas. Por ejemplo, partes
previamente ocultas de otras vistas pueden volverse visibles
cuando se cambia el tamaño de una vista. Si el view handler
coordina la actualización de las vistas, debe ser notificado del
cambio de tamaño (Publisher-Subscriber).
Implementación
4. Defina el view handler. Implemente funciones para crear vistas
como Factory Methods. Los clientes pueden especificar las vistas
que quieren, pero no controlan cómo son creadas. El view
handler es responsable de instanciar e iniciar el componente
vista correcto.
El view handler mantiene internamente referencias a todas las
vistas abiertas. El patrón Iterator puede ayudar a implementar
esta funcionalidad. El view handler también puede mantener
información adicional sobre las vistas, como la posición actual y
el tamaño de cada vista en la pantalla.
Implementación
El view handler puede necesitar implementar políticas de
coordinación de vistas específicas de la aplicación. Por ejemplo,
una vista puede desplegar información sobre otra vista, por
ejemplo llevar una bitácora sobre una simulación animada. La
organización de las vistas debe ubicar a estas dos vistas
dependientes una al lado de la otra, o, si ambas vistas están
minimizadas, la apertura de una debe abrir a la otra.
Implementación
Las estrategias de actualización son otro ejemplo de
coordinación de vistas. Puede ser necesario, dar una mayor
prioridad a la actualización de algunas vistas. Por ejemplo,
aquellas vistas que muestran alarmas pueden necesitar se
actualizadas antes que otras vistas. En tal caso, los proveedores
notifican al view handler sobre los cambios antes que a las vistas
dependientes. El view handler pasa estas solicitudes a las vistas
afectadas usando su estrategia de actualización. Los view
handler que coordinan la actualización de vistas ofrecen
usualmente una función de actualización en su interfaz pública.
Implementación
Para permitir que las estrategias de coordinación sean
intercambiables pueden ser implementadas con el patrón
Strategy. El patrón de diseño Mediator ayuda en la
implementación de la coordinación de vistas, por ejemplo
difundiendo una solicitud de refresco a todas las vistas abiertas.
Use el patrón Singleton para asegurar que no haya sino una
instancia de la clase view handler.
Variantes
• View Handler con objetos Command. Esta variante usa
objetos Command para mantener el view handler
independiente de las interfaces de las vistas. En lugar de
invocar directamente la funcionalidad, el view handler crea
un comando apropiado y lo ejecuta. El command sabe como
operar en la vista; por ejemplo, se puede especificar un
comando organizar que, cuando sea ejecutado, primero
invoque la función tamaño y luego la función mover de una
vista. Otra opción es crear comandos y pasarlos a un
Command Processor de comandos quien se encarga de su
correcta ejecución, y también permite funcionalidad adicional
como deshacer.
Usos conocidos
• Macintosh Window Manager. El Window Manager es parte
del conjunto de herramientas Macintosh que puede ser
comparado a un view handler. Su interfaz ofrece funciones
para ubicación de ventanas, presentación, ubicación del
ratón, movimiento de ventanas y cambio de tamaño,
mantenimiento de una región de actualización. También
proporciona una estructura de datos para cada ventana
Macintosh.
Como no ofrece funciones que operen en varias o en todas
las ventanas, el MWM puede ser visto como un componente
view handler de bajo nivel.
Usos conocidos
• Microsoft Word. El procesador de palabras de Microsoft
ofrece funciones para clonar, dividir y organizar ventanas, y
también para traer una ventana abierta a primer plano. Al
salir de Word se cierran todas las ventanas abiertas; se
despliegan diálogos solicitando la acción deseada si una
ventana contiene datos que han sido cambiados pero no
guardados. Este es un ejemplo de cómo un sistema View
Handler puede lucir frente a un usuario, y la funcionalidad
que proporciona.
Ver también
• El patrón de arquitectura Model-View-Controller proporciona una
infraestructura para separar la funcionalidad del comportamiento
de entrada y salida. Desde la perspectiva de MVC el patrón view
handler es un refinamiento de la relación entre el modelo y sus
vistas asociadas.
• El patrón de arquitectura Presentation-Abstraction-Control
implementa la coordinación de múltiples vistas de acuerdo con
los principios del patrón view handler. Un agente PAC de nivel
intermedio que crea y coordina vistas corresponde al view
handler. Los agentes PAC de bajo nivel que presentan datos al
usuario representan los componentes vista.
Bibliografía
• Buschmann Frank, Meunier Regine, Rohnert Hans,
Sommerlad Peter, Stal Michael, Pattern Oriented Software
Architecture: A System of Patterns, Volume One, Wiley,
1996