Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



lunes, 21 de octubre de 2013

El patrón Observer: Estación Meteorológica

El patrón Observer.

Estación Meteorológica


Cuando expliqué en la entrada del  Juego Conecta 4 (paso paso 6):formularios.html, al final del artículo, explique  como hice para que se "escuchaba" por parte de la clase ClassJugadorHumano, la acción del que el jugador pulsara sobre el tablero.
Bien, existe una forma mejor de hacerlo que es usando el patrón Observer, básicamente se trata de usar uno (o varios) objeto observador, que esta presente tanto en el objeto observado (Sujeto) como los objetos que observan  (ConcreteObservadorA, ConcreteObservadorB). Cada vez que se produzca un cambio, el objeto Subject se lo notifica a los observadores.

El objeto Subject (A), va a tener realmente una lista de los objetos Observer que irán siendo notificados de los cambios que se hayan producido.
El objeto observador (B), cuando reciba ese mensaje realizará una la acción oportuna.

Os dejo un ejemplo: Estación Meteorológica
Se trata de una estación meteorológica de recogida de datos, estos se van a presentar en varios formularios "diplay". Cada vez que cambie algún dato de la meteorológica, al actualizar, automaticamente se modificarán todos los datos de los distintos display que se encargarán de mostrar los datos actualizados.

El esquema de las clases sería el siguiente:

En los código en Java en que me he basado, las clases DisplayLogo, DisplayBN y DisplayAzul, tenían herencia múltiple de Display y Observador. Como Gambas3, solo tiene herencia simple (no admite herencia multiple), he creado la clase "ObservadorDisplay", que hereda de la clase Observador. Cuando se crea (se hace uso del constructor _New ) tiene un parámetro de tipo clase Display, y cuando se usa su método update, llama al update del objeto Display pasado como  parámetro, consiguiendo así el mismo efecto.


Esquema del proyecto "EstaciónMeteorológica"

Describamos las clases:
La clase Display:

La clase Observador:

La clase Subject:

Veamos las clases que heredan de estas...
La clase ObservadorDisplay:
Esta clase nos va a servir para emular la herencia multiple en gambas3
Ahora vemos las distintas clases para los Displays:
La clase DisplayAzul, DisplayBN y DisplayLogo, son muy similares, lo unico que cambia es el uso del Formulario mpara mostar los datos. Fijate como hemos usado el objeto "obs" que es de la clase ObservadorDisplay:
- Al crearlo se le ha pasado la referencia del objeto DisplayAzul, usando "me"
- A continuación, se le ha registrardo como observador en objeto misDatosMet, recibido como parametro
También el procedimiento BorradoObservadores(), realiza el borrado del objeto observador en misDAtosMet y cierre del formulario que muestra los datos, para que no queden referencias circulares sin cerrar al terminar el programa.

Los formularios y codigos de esto, solo cambian en el sentido de la distribución de las etiquetas que muestran los datos y el tipo de icono Clase del Formulario FormDisplayAzul.class

Nota:
Es importante la subrutina "actualizarValores()", ya que va a hacer que se actualicen los datos en el formulario. Si solo usaramos el evento Show, no se actualizan.

Ahora vamos a ver la clase "DatosMetorologico", que hereda de la clase Subject: Lo mas interesante es la subrutina "NotificarObservadores", donde recorre la lista de observadores registrados, para actualizar los datos de cada uno de ellos.

El programa en funcionamiento:
Ejecutando el programa: Resultado de pulsar el botón Actualizar

Código fuente completo del ejemplo: enlace




Fuentes
http://www.clubdesarrolladores.com/articulos/mostrar/115-observer-pattern-patron-observador