In sehr einfachen Worten (da die anderen Antworten Sie ohnehin auf alle offiziellen Entwurfsmuster verweisen, schauen Sie sich diese für weitere Details an):
Wenn Sie eine Klasse haben möchten, die von anderen Klassen im Ökosystem Ihres Programms überwacht wird, möchten Sie, dass die Klasse beobachtbar ist. Das heißt, es gibt möglicherweise einige Änderungen in seinem Status, die Sie an den Rest des Programms senden möchten.
Dazu müssen wir eine Methode aufrufen. Wir möchten nicht, dass die Observable-Klasse eng mit den Klassen verbunden ist, die daran interessiert sind, sie zu beobachten. Es ist egal, wer es ist, solange es bestimmte Kriterien erfüllt. (Stellen Sie sich vor, es ist ein Radiosender, es ist egal, wer zuhört, solange ein UKW-Radio auf seine Frequenz eingestellt ist.) Um dies zu erreichen, verwenden wir eine Schnittstelle, die als Observer bezeichnet wird.
Daher verfügt die Observable-Klasse über eine Liste von Beobachtern (dh Instanzen, die möglicherweise die Observer-Schnittstellenmethoden implementieren). Wann immer es etwas senden möchte, ruft es die Methode einfach nacheinander bei allen Beobachtern auf.
Das Letzte, was das Rätsel schließt, ist, wie die Observable-Klasse weiß, wer interessiert ist. Daher muss die Observable-Klasse einen Mechanismus bieten, mit dem Beobachter ihr Interesse registrieren können. Eine Methode wie z. B. addObserver(Observer o)
fügt den Beobachter intern zur Liste der Beobachter hinzu, sodass er, wenn etwas Wichtiges passiert, die Liste durchläuft und die entsprechende Benachrichtigungsmethode der Beobachterschnittstelle jeder Instanz in der Liste aufruft.
Es könnte sein, dass sie Sie im Interview nicht explizit nach dem java.util.Observer
und gefragt haben, java.util.Observable
sondern nach dem generischen Konzept. Das Konzept ist ein Entwurfsmuster, das Java direkt nach dem Auspacken unterstützt, damit Sie es bei Bedarf schnell implementieren können. Daher würde ich vorschlagen, dass Sie das Konzept und nicht die tatsächlichen Methoden / Klassen verstehen (die Sie bei Bedarf nachschlagen können).
AKTUALISIEREN
Als Antwort auf Ihren Kommentar bietet die eigentliche java.util.Observable
Klasse die folgenden Einrichtungen:
Verwalten einer Liste von java.util.Observer
Instanzen. Neue Instanzen, die benachrichtigt werden möchten, können durch hinzugefügt addObserver(Observer o)
und durch entfernt werden deleteObserver(Observer o)
.
Beibehalten eines internen Status, Angabe, ob sich das Objekt seit der letzten Benachrichtigung an die Beobachter geändert hat. Dies ist nützlich, da es den Teil, in dem Sie sagen, dass sich der Observable
geändert hat, von dem Teil trennt , in dem Sie die Änderungen benachrichtigen. (ZB ist es nützlich, wenn mehrere Änderungen vorgenommen werden und Sie nur am Ende des Prozesses und nicht bei jedem kleinen Schritt benachrichtigen möchten.) Dies geschieht durch setChanged()
. Also nennst du es einfach, wenn du etwas in das geändert hast Observable
und du willst, dass der Rest Observers
irgendwann davon erfährt.
Benachrichtigung aller Beobachter, dass sich der Observable
Status geändert hat. Dies geschieht durch notifyObservers()
. Dies prüft, ob sich das Objekt tatsächlich geändert hat (dh ein Anruf setChanged()
wurde getätigt), bevor mit der Benachrichtigung fortgefahren wird. Es gibt zwei Versionen, eine ohne Argumente und eine mit Object
Argument, falls Sie zusätzliche Informationen mit der Benachrichtigung übergeben möchten. Intern passiert, dass es nur die Liste der Observer
Instanzen durchläuft und die update(Observable o, Object arg)
Methode für jede von ihnen aufruft . Hier Observer
erfahren Sie, welches Objekt sich geändert hat (möglicherweise haben Sie mehr als eines beobachtet), und welches zusätzliche Objekt Object arg
möglicherweise zusätzliche Informationen enthält (übergeben) notifyObservers()
.