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:



jueves, 31 de octubre de 2013

Patrón Decorador: Cafes y condimentos. Adjuntar responsabilidad adicional a un objeto dinámicamente.

Patrón Decorador: 

Cafés y Condimentos

"Adjuntar responsabilidad adicional a un objeto dinámicamente."





Aplicación:
  • Añadir objetos individuales de forma dinámica y transparente
  • Responsabilidades de un objeto pueden ser retiradas
  • Cuando la extensión mediante la herencia no es viable
  • Hay una necesidad de extender la funcionalidad de una clase, pero no hay razones para extenderlo a través de la herencia.
  • Existe la necesidad de extender dinámicamente la funcionalidad de un objeto y quizás quitar la funcionalidad extendida. (ejemplo de Cafés y Condimentos)
Esquema de las clases que componen el patrón Decorador

Ejemplo de aplicación:
Tenemos una tienda de cafés, donde tenemos varios tipos de cafés y  condimentos (chocolate, leche, canela, leche condesada), queremos hacer un programa que evalué el coste del café, según los condimentos que le indiquemos (el usuario elegirá entre uno o varios, o incluso todos). Además el programa será flexible, ya que en el futuro, se le puede añadirse más tipos de cafés y condimentos.








Empezamos con el código de la clase Bebida:
Y las clases que la heredan
Cafe Espresso:
Cafe HoseBlend
Cafe Decaf:
Cafe DarkRoast:


La Clase CondimentoDecorador:
Y las clases que lo heredan:
Chocalete:

Canela:

Hielo:

Leche Condensada:
Leche

El programa Fmain:



Es muy interesante la forma de implementarlo siguiendo los valores de los checkbox:


Vista final de la aplicación:


Enlace de descarga: enlace a box.com


Fuente:
http://es.wikipedia.org/wiki/Decorator_(patr%C3%B3n_de_dise%C3%B1o)
http://barrospascual.blogspot.com.es/2007/06/el-patrn-decorador.html
Libro:
Head First Design Patterns


$9 #ARDUINO Compatible #STARTER #KIT #Unboxing La llegada del paquete

$9 #ARDUINO Compatible #STARTER #KIT 

#Unboxing 

La llegada del paquete



Como recordareis, en este blog, seguimos el avance de la campaña de $9 #ARDUINO Compatible #STARTER #KIT de Borderless Electronics.org en indiegogo. Yo contribuí con esta campaña, y ayer mismo, me llegaron las recompensas:







Creo que he sido uno de los "últimos" en recibirlo, debido a la gran cantidad de contribuyentes (no podemos olvidar que la campaña era para 12.000 $ y al final se llegó a recaudar 164.303 $) y retrasos que se produjeron en el envío postal ... pero por fin han llegado....ahora toca juguetear :) 


Recordaros, que Borderless Electronics.org, acaba de empezar una nueva campaña Be-Maker-kit (que finaliza el 30 de Noviembre) donde se puede conseguir una series  Kits de componentes (incluido la placa Compatible Arduino, tarjeta SHIELD para ampliación con puerto Ethernet, manuales, libros y videotutoriales)


be-maker-kit-plus-free-lessons-on-electronics-from-zero-to-internet-of-things






Comparativa de precios y Kits

miércoles, 30 de octubre de 2013

Patrón de Diseño: Template Method. Ejemplo de valoración de un jugador de futbol


Patrón de Diseño: Template 

Ejemplo de 

valoración de un jugador de futbol



"El patrón de diseño Template Method forma parte de la familia de patrones denominados de comportamiento. Este tipo patrones ayudan a resolver problemas de interacción entre clases y objetos.

Este patrón nace de la necesidad de extender determinados comportamientos dentro de un mismo algoritmo por parte de diferentes entidades. Es decir, diferentes entidades tienen un comportamiento similar pero que difiere en determinados aspectos puntuales en función de la entidad concreta.


Una posible solución podría ser copiar el algoritmo en cada de las diferentes entidades cambiando la parte concreta en la que difieren. Esta solución tiene una consecuencia negativa ya que se genera código duplicado.


La solución que propone el patrón Template Method es abstraer todo el comportamiento que comparten las entidades en una clase (abstracta) de la que, posteriormente, extenderán dichas entidades. Esta superclase definirá un método que contendrá el esqueleto de ese algoritmo común (método plantilla o template method) y delegará determinada responsabilidad en las clases hijas, mediante uno o varios métodos abstractos que deberán implementar." (1)

Básicamente consiste en definir una clase "padre" que contengas todos los métodos con sus algoritmos correspondientes, y luego crear clases "heredadas de esta" donde modifiquemos algún método de la clase "padre", para especificar un comportamiento diferente de la nueva clase.


Ejemplo:
(Nota: Ejemplo en el realizado por Miguel Arlandy Rodríguez, pero convertido a Gambas3)
Imaginemos que tenemos que desarrollar un pequeño programa que nos de una valoración de los jugadores de un equipo de fútbol en función de ciertos parámetros. Supongamos que el equipo está compuesto por porteros y delanteros (los defensas y centrocampistas nos los saltaremos...). El programa deberá comportarse de la siguiente manera:

  • Para cada jugador devolverá una valoración: malísimo, malo, normal, bueno o galáctico.
  • Todo jugador que haya disputado menos del 20% de los minutos que disputó su equipo será considerado malísimo.
  • Los jugadores suman puntos positivos si alcanzan unos objetivos.
  • El objetivo de los delanteros es marcar goles, sumarán 30 puntos por cada gol por partido que promedien. Ejemplo: si un jugador marca de media 0,8 goles por partido sumará 24 puntos.
  • El objetivo de los porteros es no recibir goles, perderán 30 puntos por cada gol por partido que promedien, pero partirán con 50 puntos. Ejemplo si un portero encaja 1,1 gol por partido sumará 17 puntos (50 - 30*1,1), si recibiese 0,5 goles por partido sumaría 35 puntos (50 - 30*0,5).
  • A los jugadores que más cobren se les exigirá más, por lo que los jugadores perderán puntos en función de su salario. Imaginemos que el salario de los jugadores oscila del 1 al 15.
  • Los delanteros perderán el 10% de su salario en puntos. Ejemplo: si un delantero cobra 12 perderá 1,2 puntos.
  • Los porteros perderán el 8% de su salario en puntos. Ejemplo: si un portero cobra 12 perderá 0,96 puntos.
  • Los jugadores que obtengan menos de 0 puntos serán considerados malísimos.
  • Los jugadores que obtengan entre 0 y 10 puntos serán considerados malos.
  • Los jugadores que obtengan entre 10 y 20 puntos serán considerados normales.
  • Los jugadores que obtengan entre 20 y 40 puntos serán considerados buenos
  • Los jugadores que obtengan más de 40 puntos serán considerados galácticos.

Empezamos con definir una clase para manejar los intervalos:
->

A partir de esta clase generica, vamos a definir una clase heredada donde especificamos los valores de los intervalos:



El método Plantilla ( Template Method)
Antes de nada definiremos nuestra superclase Jugador, que contendrá todo el comportamiento y elementos comunes de cualquier tipo de jugador (ya sean delanteros o porteros).
Observemos las principales características de la clase:
  • La clase es abstracta, por lo que un jugador por sí solo no es nada. Habrá que precisar si es delantero o portero.
  • Contiene las propiedades comunes de cualquier jugador: nombre, minutos jugados y salario.
  • Contiene una clase ValoracionJugador que nos ayudará a definir los intervalos y la clasificacion del jugador dado
  • Contiene el método plantilla calculaValoracion que define el esqueleto de la lógica de cálculo de valoración de un jugador, implementando las partes comunes y delegando las clases concretas en las subclases.
  • Contiene los métodos abstractos: calculaPuntosPorObjetivos y getPuntosPenalizacionPorSalarioAlto que deben ser implementados por las subclases (en función de si es delantero o portero). Obsérvese que el método plantilla (método calculaValoracion) hace uso de ellos.
Las Subclases:
LLegó el momento de definir los comportamientos concretos o, lo que es lo mismo, de extender de la clase Jugador. En este punto implementaremos la forma de calcular los puntos por objetivos y los puntos de penalización por salario alto, tanto para delanteros como para porteros.

La clase Delantero quedaría de la siguiente forma:

La clase Portero quedaria:
Probando el método plantilla.
En el método Form_Show, se genera una salida como en el ejemplo original. Además se ha incluido un formulario para trabajar dinamicamente con el programa y que nos vaya dando los resultados.


Resultados del programa.


Enlace de descarga del ejemplo: enlace box

Enlace de Referencia:
(1) http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=PatronTemplateMethod

lunes, 28 de octubre de 2013

PayPal: Como enviar dinero a un amigo o famililar sin coste sin pagar tarifas

PayPal:
 Como enviar dinero a
 un amigo o familiar
 sin coste, sin pagar tarifas.

Para estar exentos de tarifa de pagos, se deben cumplir dos condiciones:
1) Ser pagos personales por envío de dinero de amigos o familiares
2) Enviar y recibir pagos personales es gratis siempre que estos se hayan realizado con el saldo PayPal (o una cuenta bancaria).


Os dejo un video actualizado el 4/11/2014, ya que paypal ha cambiado la página web 




La siguiente explicación ya no es válida porque PayPal cambio el formato de la página web:
Ejemplo:

Quieres enviar 20 euros a un amigo, y no quieres pagar ninguna tarifa. Para hacerlo, tienes que tener saldo en tu paypal (por lo menos 20 euros), y enviárselos siguiendo los siguientes pasos, desde tu cuenta de paypal:
1) Entramos en nuestra cuenta de paypal, y pulsar en "Enviar dinero"
2)Indicar la direccion de correo electronico que nuestro amigo o familiar tenga en paypal, y marcar "enviar dinero a familiares o amigos


3) Indicarias tambien el importe a enviar

Y ya esta, nuestro amigo o familiar recibirá el dinero sin que se apliquen ninguna tarifa.


Notas:
a) Si no se cumplen estas condiciones, se cargará una pequeña tarifa (3,4% + 0,35 EUR).
b) Los pagos comerciales son por la venta de un producto o servicio y la tarifa estándar por recibir es 3,4% + 0,35 EUR independientemente de la fuente de fondos. Hay tarifas especiales para gente que se dedique a vender productos o servicios
c)Tenga en cuenta que los pagos personales no están cubiertos bajo la protección de PayPal





Nota:
Si no ve completo este articulo es que tienes adblock activado. Por favor desactive adblock para este blog. Gracias

Excel: Poner el nombre del archivo y el nombre de la hoja en una celda

Excel: 

Poner el nombre del archivo y el nombre de la hoja en una celda




       Bueno, esta vez voy a tocar un tema sobre Excel que me ha traído de los pelos durante varias horas, visitando la documentación online de Microsoft (que ayuda más bien poco) y algunas páginas web, hasta que encontré la solución.

    Por cuestiones de organización, muchas veces nos interesa que al imprimir un parte de un documento, nos salga el nombre del archivo y el nombre de la pestaña. Normalmente se añade una cabecera o pie de pagina donde se incluye. Pero si esa parte del documento excel (una gráfica o tabla por ejemplo) va insertada en otro documento (por ejemplo un word), ya no tenemos esa opción. 

Existe una forma de poner el nombre del documento, su ruta e incluso el nombre de la pestaña en una celda, con lo cual podíamos insertar la gráfica o la tabla junto con el dato que nos interese .


Para hacer esto, en la celda que nos interese tenemos que poner estas fórmulas:

Poner ruta+nombre+pestaña:

=Celda("nombrearchivo")

Con esto se consigue poner el nombre completo (ruta+nombre+pestaña):
  • C:\Users\jsanchezberro\Documents\[pepito.xlsx]Hoja1

Poner nombre (sin ruta ni pestaña):

=EXTRAE(CELDA("nombrearchivo");ENCONTRAR("[";CELDA("nombrearchivo"))+1;ENCONTRAR("]";CELDA("nombrearchivo"))-ENCONTRAR("[";CELDA("nombrearchivo"))-1)

Con esta fórmula solo ponemos el nombre del archivo (sin ruta ni pestaña):
  • pepito.xlsx

Poner pestaña( sin ruta ni nombre):

=EXTRAE(CELDA("nombrearchivo";A1);ENCONTRAR("]";CELDA("nombrearchivo";A1))+1;32)

Con esta fórmula ponemos el nombre de la pestaña:
  • Hoja1

Ejemplo:

Documento Word, con una gráfica Excel
mostrando datos del fichero donde guardamos la gráfica.



Espero que os sea útil. Saludos




Fuente:

Nota:
Si no ve completo este articulo es que tienes adblock activado. Por favor desactive adblock para este blog. Gracias

sábado, 26 de octubre de 2013

Nueva Campaña de #Borderless #Electronics: #Kit para #arduino

Nueva Campaña de #Borderless #Electronics:

#Kit para Arduino  de 600 piezas

Os traigo una nueva compaña de Borderless Electronics , esta vez se trata del complemento perfecto para los que tienen (o piensan) comprar un arduino. Se trata de un completo kit de piezas electrónicas  de 600 piezas a muy buen precio.



Si te interesa sigue este enlace: http://igg.me/at/bemaker




Todo lo que necesitamos para empezar proyectos electrónicos...

Ejecutar programas realizados en Gambas en equipos con Windows

 

 Ejecutar Programas

 Realizados en Gambas en equipos con Windows


Bueno, no voy a contar nada nuevo, pero por si alguien no lo sabe, comentaré dos formas de ejecutar programas realizados en Gambas ( o cualquier programas que use  sistema operativo gnu/linux), en un ordenador Windows. 

Nota:
A un ordenador Windows, le llamo a un equipo que tenga instalado un solo sistema operativo Windows (Windows XP, Windows 7 o Windows 8)




Empezamos:
Antes de nada: Crear un liveDVD
Un LiveDVD es un disco DVD donde se le ha grabado de una forma "especial" un sistema gnu/linux, y que es capaz de hacer funcionar el ordenador.
¿como conseguirlo?
  •  Descarga una distribucion gnu/linux que sea liveDVD. Te aconsejo que descargares "MininNo PicarOS Diego" (pagina de descarga) ya que esta contiene Gambas3.4.2 y muchas aplicaciones de gnu/linux.
  • Se te descargará un archivo ".iso" que lo tienes que "quemar" (enlace de programas gratuitos que lo hacen) en un LiveDVD. Cuando hayas terminado ya tienes preparado el sistema operativo gnu/linux en un liveDVD arrancable.


Opción 1) Usar un LiveCD o LiveDVD para arrancar el ordenador

Para ello tenemos que:
  • a) Hacer que nuestro ordenador arranque desde la unidad CD o DVD. Esto lo podemos configurar en setup de la bios. Dejando como primer dispositivo de arranque el CD o DVD y luego el disco duro. Os dejo un video para que veais como se hace:
         

  • b) Introduce tu LiveDVD en tu ordenador. Apagas tu ordenador y vuelvelo a encender.
  • c) Se te iniciará el menu de arranque del LiveDVD, elige "minino" e idioma "castellano" y se arrancará tu sistema gnu/linux MiniNo PicarOs Diego. En el podras ejecutar los programas Gambas. Tambien pudes guardar los datos en tu disco duro o en una memoria USB.
  • d) Cuando hayas terminado de usarlos. Apaga tu ordenador, saca tu LiveDVD. y ya podrá volver a usar tu windows.

 Opción 2) Crear una máquina virtual.
 Esta opción es para equipos que sea "potentes" y con un mínimo de memoria de más de 1 GB. Se trata de instalar un programa llamado VirtualBox (enlace de descarga), que es capaz de simular un ordenador dentro del tuyo. Puedes configurar la memoria, cuando su disco duro, etc.



En este programa crearias una máquina con sistema operativo Linux, con 10 gb de espacio de disco duro, asignandole un minimo de 512 mb de memoria ram. 
Y como disco de arranque el CD, indicandole una imagen .iso (por ejemplo la de "MininNo PicarOS Diego" (pagina de descarga))

Arrancas la máquina virtual y se ejecutará MiniNo PicarOs. Deberás de instalarlo en el disco virtual de tu máquina virtual. Puedes ver como se instala en este video:


Asi tendrás una maquina virtual con MiniNo PicarOs Diego, completamente usable.

Espero que os sea útil.

Saludos

Julio

viernes, 25 de octubre de 2013

Nueva Versión de Gambas: 3.5.0

   Nueva Versión de Gambas: 3.5.0



Acaba de salir del "horno", una nueva versión de gambas 3.5.0


PPA, para Ubuntu y derivadas:
$sudo add-apt-repository ppa:nemh/gambas3  
$sudo apt-get update
$sudo apt-get install gambas3


Notas de esta versión:

¿que hay de nuevo?
Esta nueva versión corrige más de 240 errores y añade más de 270 nuevas características (sí, los mismos números que en Gambas 3.4).

Tenga en cuenta que muchos de estos errores ya se han portado a las versiones 3.4.x.

He aquí un resumen de los principales cambios:

Entorno de desarrollo
El editor de menús ha sido corregido.
Se proporciona un nuevo editor de imágenes .
El editor de la base de datos ahora puede recordar un número arbitrario de peticiones SQL para cada conexión.
Apoyo Subversion ha sido corregido.
Si el IDE genera un error inesperado Gambas , todos los archivos modificados se guardan automáticamente antes de salir.
Aplicación web se puede depurar el IDE a través de las páginas integradas de http gb.httpd componente de servidor .

Intérprete y compilador
Application.Priority es una nueva propiedad que permite definir la prioridad de planificación del proceso actual ( o tarea "task" ) .
Match es un nuevo operador que cargue automáticamente el componente gb.pcre implementar coincidencia de patrones PCRE .
Soporte de manejador de error global . 
Soporte ARM se ha corregido y Gambas debe ser confiable ahora en esa arquitectura.
Nuevo. [ Xxx ] y ! Xxx sintaxis que se puede utilizar dentro de una With ... End With estructura como accesos directos de descriptor de acceso de matriz.

Componentes
gb.clipper es un nuevo componente basado en la biblioteca Clipper .
gb.openssl es un nuevo componente en anidar funciones criptográficas de libcrypto del proyecto OpenSSL .
FileProperties es un nuevo control que muestra las propiedades de un archivo o directorio específico .
ImageView es un nuevo control que permite la visualización de una imagen dentro de una vista desplazado , en los diferentes niveles de zoom.
Control deslizante es un nuevo control que muestra un cursor y una SpinBox , ambos están sincronizados.
Horizontal barras de herramientas ahora puede crecer verticalmente si no hay suficiente espacio para los elementos de la barra de herramientas .
gb.gmp es un nuevo componente basado en el múltiple de precisión aritmética Biblioteca GNU que implementa BigInt y números racionales .
El componente gb.image tiene nuevos métodos para aplicar efectos de equilibrio para una imagen.
gb.media ahora está basado en GStreamer 1.0 . El control MediaPlayer ahora puede tomar una captura de pantalla del cuadro de video actual.
gb.openal es un nuevo componente basado en la biblioteca de audio 3D OpenAL .
gb.opengl.sge es nuevo componente que implementa un motor de juego OpenGL simple basado en el formato MD2 .
gb.xml.rpc ahora es mucho más fiable .


miércoles, 23 de octubre de 2013

Patrón Abstract Factory: La Fábrica de Vehículos

Patrón Abstract Factory

 La Fábrica de Vehículos






"Una factoría es un objeto que maneja la creación de otros objetos. Las factorías se utilizan cuando la creación de un objeto implica algo más que una simple instanciación. Los siguientes ejemplos son casos donde una factoría puede ayudar:
  • Es necesario acceder a algún recurso para la creación y configuración de un objeto.
  • No conocemos hasta el momento preciso de la instanciación qué tipo concreto de objeto se va a instanciar.

En estos casos, en lugar de que sea el propio objeto quien se encargue de todos los aspectos relativos a la creación, se crea otro objeto que lo haga. De esta manera, se libera al objeto que va a ser creado de aquellas responsabilidades que no le corresponden pero que son necesarias para su creación, manteniendo su independencia." (referencia (1) blog tratandodeentenderlo)
ref 2: http://lineadecodigo.com/patrones/patron-abstract-factory/

Ejemplo: La fábrica de vehículos.
Vamos a realizar el ejemplo que expone   (ref. 3 http://codejavu.blogspot.com.es/2013/07/ejemplo-patron-abstract-factory.html), en Gambas3.

Problema:
Se solicita la creación de diferentes vehículos de transporte (Buses, MicroBusBus y Taxis) sin que se especifique en detalle la forma de su creación.
Solución:
Utilizamos el patrón Abstract Factory para independizar la forma como crearemos los objetos, de esta manera creamos familias de objetos de tipo Vehículo delegando el proceso y sin tener que entrar en detalles desde la clase solicitante.

Esquemas de las clases a crear:


Esquema del proyecto en Gambas3:


Las interfases: 
Clases Vehiculo
-

Clase Vehiculo de Transporte
-

Las Fábricas
Se componen por la Fabrica de Vehículos Principal que hace el llamado a las fabricas de Objetos Concretos..... estas implementan la interface VehiculoDeTransporte permitiendo crear los vehículos del tipo correspondiente y asignar el respectivo código de creación.....

Clase Fabrica de Vehiculos
Esta clase sera la Fabrica Principal cuenta con un método estático que permitirá la creación de los diferentes tipos de vehículos, aplicamos el concepto de polimorfismo para ejecutar el llamado a la Fabrica correspondiente y crear el objeto concreto solicitado por el cliente.
-

Clase Fabrica de Bus
-
Clase Fabrica de MicroBus

-
Clase Fabrica de Taxi
-

Las clases Concretas:
la Clase Taxi

La Clase Bus

La Clase Microbus

El programa principal:
Este formulario Fmain permite iniciar el sistema, en ella creamos las instancias de Fabricas y mediante un menú de opciones se define y delega que Fabrica inicia el proceso de creación...

-
Programa en ejecución cuando pulsamos sobre el botón "Crear"

Enlace de descarga del ejemplo completo: descarga ejemplo



Enlaces:
(1)http://tratandodeentenderlo.blogspot.com.es/2010/02/patrones-de-diseno-factorias.html
(2)http://lineadecodigo.com/patrones/patron-abstract-factory/
(3)http://codejavu.blogspot.com.es/2013/07/ejemplo-patron-abstract-factory.html

http://en.wikipedia.org/wiki/Factory_method_pattern

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