Author: Gloria Riascos Delgado - Diana Rivadeneira
PATRON OBSERVER
Definición:
Este patrón define una dependencia del tipo uno-a-muchos entre objetos, de manera que cuando uno de los objetos cambia su estado, el Observador se encarga de notificar este cambio a resto de los objetos dependientes. El objetivo de este patrón es desacoplar la clase de los objetos clientes del objeto, aumentando la modularidad del lenguaje, así como evitar bucles de actualización.
Motivación: Mantener la consistencia entre objetos relacionados, sin aumentar el acoplamiento entre clases.
Ej: separación de la capa de presentación en una interfaz de usuario de los datos de aplicación subyacentes.
Figura 2: Separación de la capa de presentación en una interfaz
Fuente: Patrones de diseño
Uso del Patrón Observer:
Cuando una abstracción tiene dos aspectos, y uno depende del otro. Encapsular los aspectos en objetos distintos permite cambiarlos y reutilizarlos.
Cuando cambiar un objeto implica cambiar otros, pero no sabemos exactamente cuántos hay que cambiar.
Cuando un objeto debe ser capaz de notificar algo a otros sin hacer suposiciones sobre quiénes son dichos objetos. Esto es, cuando se quiere bajo acoplamiento.
Participantes
Observador: Define la interfaz de los objetos a los que hay que notificar cambios del Sujeto.
ObservadorConcreto: Mantiene una relación con un SujetoConcreto. Mantiene el estado del SujetoConcreto que le es de interes. Implementa Observador para mantener su estado coherente con el del Sujeto.
Sujeto: Conoce a sus observadores. Tiene una interfaz para ir añadiendo y eliminando observadores.
SujetoConcreto: Envía notificaciones a sus observadores cuando su estado cambia.
Figura: Diagrama de la Clase Observador
Fuente: Patrones de diseño.
Consecuencias
• Permite modificar sujetos y observadores de manera independiente
• Permite reutilizar un sujeto sin reutilizar sus observadores, y viceversa
• Permite añadir observadores sin tenerque cambiar el sujeto ni los demás observadores
• Acoplamiento abstracto entre el sujeto y el observador. El sujeto no sabe la clase concreta de sus observadores (acoplamiento mínimo).
• Soporte para broadcast. El sujeto envía la notificación a todos los observadores suscritos. Se pueden añadir/quitar observadores.
• Actualizaciones inesperadas. Una operación en el sujeto puede desencadenar una cascada de cambios en sus observadores. El protocolo no ofrece detalles sobre lo que ha cambiado.
(Sánchez, 2008).
EJEMPLO
Figura : Ejemplo Practico
Fuente: https://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-observer/
Vamos a suponer un ejemplo de una clase Tiempo(horas,minutos y segundos), tendrá un método de la interfaz IObservable para añadir y eliminar observadores.
Figura : Interfaz IObservable para añadir y eliminar Observadores
Fuente: https://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-observer/
Se muestra un método toString() para convertir el objeto tiempo en cadena. Un método privado notificar(); para informar a los observadores sobre los cambios de estado, además un método Start() que inicie la ejecución del hilo con el bucle infinito.
Figura : Método ToString(); Método notificar(); Método Start();
Fuente: https://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-observer/
El hilo utiliza la interfaz Runnable para informar cada segundo sobre el cambio de estado a los IObserver. atreves de el método notificar()
Figura : Cambios de estado a los IObserver
Fuente: https://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-observer/
Al finalizar mostramos los Observadores, para mostrar la hora cada segundo por consola:
Figura : Muestra de Observadores
Fuente: https://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-observer/
(Hernandez, 2013)|