En términos muy simples (porque las otras respuestas lo están refiriendo a todos los patrones de diseño oficiales de todos modos, así que mírelos para obtener más detalles):
Si desea tener una clase que es monitoreada por otras clases en el ecosistema de su programa, usted dice que desea que la clase sea observable. Es decir, puede haber algunos cambios en su estado que desearía transmitir al resto del programa.
Ahora, para hacer esto, tenemos que llamar a algún tipo de método. No queremos que la clase Observable esté estrechamente unida a las clases que están interesadas en observarla. No le importa quién sea, siempre y cuando cumpla con ciertos criterios. (Imagine que es una estación de radio, no le importa quién está escuchando mientras tenga una radio FM sintonizada en su frecuencia). Para lograrlo, utilizamos una interfaz, denominada Observador.
Por lo tanto, la clase Observable tendrá una lista de observadores (es decir, instancias que implementarán los métodos de interfaz de observador que pueda tener). Cada vez que quiere transmitir algo, simplemente llama al método en todos los observadores, uno tras otro.
Lo último que cierra el rompecabezas es cómo sabrá la clase Observable quién está interesado. Por lo tanto, la clase Observable debe ofrecer algún mecanismo que permita a los Observadores registrar su interés. Un método comoaddObserver(Observer o)
interno agrega al Observador a la lista de observadores, de modo que cuando sucede algo importante, recorre la lista y llama al método de notificación respectivo de la interfaz del Observador de cada instancia en la lista.
Puede ser que en la entrevista no le hayan preguntado explícitamente sobre el java.util.Observer
yjava.util.Observable
concepto genérico sino sobre él. El concepto es un patrón de diseño, que Java proporciona soporte directamente fuera de la caja para ayudarlo a implementarlo rápidamente cuando lo necesite. Por lo tanto, sugeriría que comprenda el concepto en lugar de los métodos / clases reales (que puede consultar cuando los necesite).
ACTUALIZAR
En respuesta a su comentario, la java.util.Observable
clase real ofrece las siguientes instalaciones:
Mantener una lista de java.util.Observer
instancias. Se pueden agregar addObserver(Observer o)
y eliminar nuevas instancias interesadas en recibir notificaciones deleteObserver(Observer o)
.
Mantener un estado interno, especificando si el objeto ha cambiado desde la última notificación a los observadores. Esto es útil porque separa la parte donde dice que Observable
ha cambiado, de la parte donde notifica los cambios. (Por ejemplo, es útil si tiene varios cambios y solo desea notificar al final del proceso en lugar de en cada pequeño paso). Esto se hace a través de setChanged()
. Así que simplemente lo llamas cuando cambiaste algo Observable
y quieres que el resto lo Observers
sepa.
Notificar a todos los observadores que lo específico Observable
ha cambiado de estado. Esto se hace a través de notifyObservers()
. Esto verifica si el objeto realmente ha cambiado (es decir, se realizó una llamada a setChanged()
) antes de continuar con la notificación. Hay 2 versiones, una sin argumentos y otra con un Object
argumento, en caso de que desee pasar información adicional con la notificación. Internamente, lo que sucede es que simplemente recorre la lista de Observer
instancias y llama al update(Observable o, Object arg)
método para cada una de ellas. Esto indica Observer
cuál fue el objeto Observable que cambió (podría estar observando más de uno) y el extra Object arg
para llevar potencialmente información adicional (transmitida) notifyObservers()
.