Con este, doy comienzo a una serie de artículos sobre distintos patrones de diseño y su implementación en lenguaje Java. El objetivo no es formar al programador experto, sino facilitar la comprensión de los patrones a todo aquel que se inicie en el mundo de la programación.
En este caso, comenzaremos con el patrón Observer que, por ejemplo, está presente en la JDK de Java en los denominados Listeners y Adapters que son utilizados para atender a las acciones realizadas por un usuario sobre un componente de la interfaz gráfica.
Patrón Observer.
El patrón Observer nos permite implementar una estrategia que reaccione a los cambios de estado en el objeto observado.
Debemos identificar los siguientes actores en la implementación del patrón:
- Objetos observables: Estos objetos deberán implementar un mecanismo para poder añadir y eliminar objetos observadores. Estableceremos las condiciones que deben cumplir a través de una interfaz IObservable. Además de los método que se ven a continuación, la interfaz, podría declarar un método “void notificar();” que se encargaría, en su implementación, de avisar a todos los observadores del cambio de estado.
- Objetos observadores: serán aquellos objetos que implementen la interfaz IObserver donde vendrá definido, al menos, un método que defina la reacción correspondiente al cambio de estado.
Con estos contratos, nos aseguramos que los elementos observadores y a observar cumplen los requisitos y pueden ser tratados de una forma genérica que nos permita cierto grado de reutilización.
Ejemplo práctico.
Resumen gráfico de la implementación a través de un diagrama UML:
A continuación se lleva a cabo la implementación de dicho patrón definiendo una clase Tiempo (horas, minutos y segundos), que tendrá codificados los métodos de la interfaz IObservable para añadir y eliminar observadores:
Incorporará también un método privado para notificar a los distintos observadores de los cambios en el estado, la sobreescritura del método toString() para convertir un objeto tiempo a cadena y un método que inicie la ejecución del hilo con el bucle infinito.
Dicho hilo utilizará la implementación de la interfaz Runnable que se encargará, cada segundo, de notificar el cambio del estado a los IObserver.
Finalmente, codificaremos los Observadores, uno para mostrar la hora cada segundo por consola:
Y otro para hacerlo a través de un JLabel en una ventana de la aplicación:
Finalmente, desarrollamos el método main que lanzará el ejemplo y mostrará como los observadores son notificados cada segundo de los cambios de estado en el objeto Tiempo observado:
El código fuente de este ejemplo está disponible para descarga aquí.
En el próximo articulo veremos el patrón Composite.
Post publicado por: Juan José Hernández
SEAS es el centro de formación online del Grupo San Valero, especializado en el ámbito técnico, industrial y de empresa. Visita www.seas.es para consultar nuestra oferta formativa de cursos y másteres. Formación profesional para el empleo de calidad y accesible para todos.