PATRON OBSERVER
Definición:
El patrón Observer, denominado también como publicación-suscriptor, se utiliza para notificar a los objetos dependientes de él, los cambios de estado a los que tenga lugar un objeto, con el fin de que todos los objetos se actualicen automáticamente acorde a los cambios realizados.
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
Subject: Conoce a sus observadores, que pueden ser un número arbitrario proporciona una interfaz para añadiry quitar objetos observadores.
Observer: Define la interfaz de los objetos a los que se deben notificar cambios en un sujeto
ConcreteSubject: Almacena el estado de interés para sus observadores envía notificaciones a sus observadores cuando su estado cambia.
ConcreteSubject: Almacena el estado de interés para sus observadores envía notificaciones a sus observadores cuando su estado cambia
ConcreteObserver: Mantiene una referencia a un ConcreteSubject almacena el estado del sujeto que le resulta de interés implementa la interfaz de Observer para mantener su estado consistente con el del sujeto.
Figura Diagrama de clases patron observer
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).
Actores en la implementación del Patrón
Objetos observables:
Estos objetos implementan mecanismos para poder añadir y eliminar objetos observadores. Se establece las condiciones a través de la interfaz IObservable la cual posee un método “void notificar();” el cual avisa a los observadores sobre el cambio de estado.
Figura 4: Objetos Observables
Fuente: https://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-observer/
Objetos observadores:
Son objetos que implementan la interfaz IObserver los cuales poseen métodos que corresponden al cambio de estado.
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 9: 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/
Figura 11: Presentación grafica del patrón Observer
Fuente: https://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-observer/
En el método Main() muestra como los observadores son notificados cada segundo de los cambios de estado en el objeto Tiempo Observa
Figura 12: Método Main()
Fuente: https://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-observer/
(Hernandez, 2013)|