In termini molto semplici (perché le altre risposte ti rimandano comunque a tutti i modelli di design ufficiali, quindi guardali per ulteriori dettagli):
Se vuoi avere una classe monitorata da altre classi nell'ecosistema del tuo programma, dici che vuoi che la classe sia osservabile. Vale a dire che potrebbero esserci dei cambiamenti nel suo stato che vorresti trasmettere al resto del programma.
Ora, per fare questo dobbiamo chiamare un qualche tipo di metodo. Non vogliamo che la classe Observable sia strettamente accoppiata con le classi che sono interessate ad osservarla. Non importa chi è, purché soddisfi determinati criteri. (Immagina che sia una stazione radio, non gli importa chi ascolta finché hanno una radio FM sintonizzata sulla loro frequenza). A tal fine, utilizziamo un'interfaccia, denominata Observer.
Pertanto, la classe Observable avrà un elenco di osservatori (ovvero istanze che implementano i metodi di interfaccia Observer che potresti avere). Ogni volta che vuole trasmettere qualcosa, chiama semplicemente il metodo su tutti gli osservatori, uno dopo l'altro.
L'ultima cosa per chiudere il puzzle è come farà la classe osservabile a sapere chi è interessato? Quindi la classe Osservabile deve offrire un meccanismo per consentire agli Osservatori di registrare il proprio interesse. Un metodo comeaddObserver(Observer o) internamente aggiunge l'Observer all'elenco degli osservatori, in modo che quando accade qualcosa di importante, scorre attraverso l'elenco e chiama il rispettivo metodo di notifica dell'interfaccia Observer di ciascuna istanza nell'elenco.
Potrebbe essere che nell'intervista non ti abbiano chiesto esplicitamente del java.util.Observerejava.util.Observable concetto generico ma. Il concetto è un modello di progettazione, a cui Java fornisce supporto direttamente per consentirti di implementarlo rapidamente quando ne hai bisogno. Quindi suggerirei di capire il concetto piuttosto che i metodi / le classi attuali (che puoi cercare quando ne hai bisogno).
AGGIORNARE
In risposta al tuo commento, la java.util.Observableclasse attuale offre i seguenti servizi:
Mantenimento di un elenco di java.util.Observeristanze. Le nuove istanze interessate a ricevere notifiche possono essere aggiunte addObserver(Observer o)e rimossedeleteObserver(Observer o) .
Mantenimento di uno stato interno, specificando se l'oggetto è cambiato dall'ultima notifica agli osservatori. Ciò è utile perché separa la parte in cui si dice che Observableè cambiata, dalla parte in cui si notificano le modifiche. (Ad esempio, è utile se si verificano più modifiche e si desidera notificare solo alla fine del processo anziché a ogni piccolo passaggio). Questo è fatto attraverso setChanged(). Quindi lo chiami quando hai cambiato qualcosa in Observablee vuoi il resto delObservers alla fine lo sappia.
Notifica a tutti gli osservatori che lo specifico Observableha cambiato stato. Questo è fatto attraverso notifyObservers(). Verifica se l'oggetto è stato effettivamente modificato (ovvero è setChanged()stata effettuata una chiamata a ) prima di procedere con la notifica. Esistono 2 versioni, una senza argomenti e una con un Objectargomento, nel caso in cui si desideri passare alcune informazioni aggiuntive con la notifica. Internamente ciò che accade è che scorre semplicemente attraverso l'elenco delle Observeristanze e chiama il update(Observable o, Object arg)metodo per ognuna di esse. Questo dice Observerquale era l'oggetto osservabile che è cambiato (potresti osservarne più di uno) e il supplemento Object argper potenzialmente trasportare alcune informazioni extra (passate attraverso notifyObservers().