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.Observer
ejava.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.Observable
classe attuale offre i seguenti servizi:
Mantenimento di un elenco di java.util.Observer
istanze. 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 Observable
e vuoi il resto delObservers
alla fine lo sappia.
Notifica a tutti gli osservatori che lo specifico Observable
ha 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 Object
argomento, nel caso in cui si desideri passare alcune informazioni aggiuntive con la notifica. Internamente ciò che accade è che scorre semplicemente attraverso l'elenco delle Observer
istanze e chiama il update(Observable o, Object arg)
metodo per ognuna di esse. Questo dice Observer
quale era l'oggetto osservabile che è cambiato (potresti osservarne più di uno) e il supplemento Object arg
per potenzialmente trasportare alcune informazioni extra (passate attraverso notifyObservers()
.