Beobachter-Muster
Das Beobachter-Muster ist ein Verhaltens-Entwurfsmuster, das eine Eins-zu-viele-Abhängigkeitsbeziehung definiert. Wenn sich der Zustand eines Objekts ändert, werden alle seine abhängigen Objekte benachrichtigt und aktualisieren sich automatisch.
Wenn zwischen Objekten eine Eins-zu-viele-Beziehung besteht, verwenden Sie das Beobachter-Muster. Wenn beispielsweise ein Objekt geändert wird, benachrichtigt es automatisch die Objekte, die von ihm abhängen. Das Beobachter-Muster ist ein Verhaltensmuster.
Einführung
Absicht
Es erzeugt eine Eins-zu-viele-Abhängigkeitsbeziehung zwischen Objekten. Wenn sich der Zustand eines Objekts ändert, werden alle Objekte, die von ihm abhängen, benachrichtigt und aktualisieren sich automatisch.
Behandeltes Hauptproblem
- Das Beobachter-Muster löst das Problem, wie andere abhängige Objekte automatisch benachrichtigt werden können, wenn sich der Zustand eines Objekts ändert, und dabei eine geringe Kopplung und eine hohe Zusammenarbeit zwischen den Objekten beibehalten wird.
Anwendungsfall
- Wenn eine Änderung des Zustands eines Objekts gleichzeitig andere Objekte aktualisieren muss.
Implementierungsansatz
- Definieren Sie die Beobachter-Schnittstelle: Enthält eine Aktualisierungsmethode.
- Erstellen Sie konkrete BeobachterImplementiert die Beobachter-Schnittstelle und definiert das Verhalten beim Empfang einer Benachrichtigung.
- Definieren Sie die Subjekt-SchnittstelleEnthält Methoden zum Hinzufügen, Entfernen und Benachrichtigen von Beobachtern.
- Erstellen Sie das konkrete Subjekt: Implementieren Sie die Subjekt-Schnittstelle, verwalten Sie die Beobachterliste und benachrichtigen Sie Beobachter, wenn sich der Zustand ändert.
Schlüsselcode
- Beobachterliste: Verwalten Sie eine Liste von Beobachtern im Subjekt.
Anwendungsbeispiel
- Auktionssystem: Der Auktionator fungiert als Subjekt, Bieter fungieren als Beobachter, und alle Bieter werden benachrichtigt, wenn der Auktionspreis aktualisiert wird.
- Geschichte der Reise nach WestenDas Besprengen mit Wasser durch den Bodhisattva dient als Zustandsänderung, und die alte Schildkröte fungiert als Beobachter, der diese Änderung beobachtet.
Vorteile
- Abstrakte Kopplung: Zwischen Beobachtern und dem Subjekt besteht eine abstrakte Kopplung.
- AuslösemechanismusEtabliert einen Auslöse- und Benachrichtigungsmechanismus für Zustandsänderungen.
Nachteile
- LeistungsproblemeWenn es viele Beobachter gibt, kann der Benachrichtigungsprozess zeitaufwändig sein.
- Zirkuläre AbhängigkeitDies kann zu zirkulären Aufrufen und Systemabstürzen führen.
- Fehlende Änderungsdetails: Beobachter wissen nicht, wie sich das Subjekt ändert, sondern nur, dass eine Änderung stattgefunden hat.
Verwendungshinweise
- Verwenden Sie es, wenn Sie die Kopplung zwischen Objekten verringern müssen und wenn Zustandsänderungen von Objekten Änderungen anderer Objekte auslösen müssen.
- Erwägen Sie die Verwendung der in Java integrierten Unterstützungsklassen für das Beobachtermuster, wie z. B.
java.util.Observableundjava.util.Observer。
Hinweise
- Zirkuläre Referenzen vermeiden: Achten Sie auf die Abhängigkeit zwischen Beobachtern und dem Subjekt, um zirkuläre Referenzen zu vermeiden.
- Asynchrone AusführungErwägen Sie die Verwendung asynchroner Benachrichtigungen, um zu vermeiden, dass ein einzelner Ausfallpunkt das gesamte System blockiert.
Struktur
Das Beobachtermuster umfasst die folgenden Kernrollen:
- Subject: Auch als das Beobachtete oder Beobachtbare bekannt, ist es ein Objekt mit Zustand und verwaltet eine Liste von Beobachtern. Das Subjekt stellt Methoden zum Hinzufügen, Entfernen und Benachrichtigen von Beobachtern bereit.
- Observer: Ein Beobachter ist ein Objekt, das Benachrichtigungen vom Subjekt empfängt. Es muss eine update-Methode implementieren, die aufgerufen wird, um Aktualisierungsvorgänge auszuführen, wenn eine Benachrichtigung vom Subjekt empfangen wird.
- Konkretes Subjekt: Ein konkretes Subjekt ist eine konkrete Implementierungsklasse des Subjekts. Es verwaltet die Beobachterliste und benachrichtigt Beobachter, wenn sich der Zustand ändert.
- Konkreter Beobachter: Ein konkreter Beobachter ist eine konkrete Implementierungsklasse des Beobachters. Er implementiert die update-Methode und definiert die spezifischen Operationen, die ausgeführt werden sollen, wenn eine Benachrichtigung vom Subjekt empfangen wird.
Das Beobachter-Muster entkoppelt Subjekt und Beobachter, um eine lose Kopplung zwischen Objekten zu erreichen. Wenn sich der Zustand des Subjekts ändert, empfangen alle Beobachter, die davon abhängen, Benachrichtigungen und aktualisieren sich entsprechend.
Implementierung
The Observer Pattern uses three classes: Subject, Observer, and Client. The Subject object has methods for binding observers to the Client object and unbinding observers from the Client object. We createSubject-Klasse,Observereine abstrakte Klasse und Klassen, die die abstrakte Klasse erweiternObserverEntitätsklasse.
ObserverPatternDemo, unsere Demo-Klasse verwendetSubjectund Entitätsklassen-Objekte, um das Beobachter-Muster zu demonstrieren.
Schritt 1
Erstellen Sie die Subject-Klasse.
Subject.java
Schritt 2
Erstellen Sie die Observer-Klasse.
Observer.java
Schritt 3
um Entitäts-Observer-Klassen zu erstellen.
BinaryObserver.java
OctalObserver.java
HexaObserver.java
Schritt 4
VerwendungSubjectund Entität-Beobachter-Objekte.
ObserverPatternDemo.java
Schritt 5
Führen Sie das Programm aus und geben Sie die Ergebnisse aus:
First state change: 15 Hex String: F Octal String: 17 Binary String: 1111 Second state change: 10 Hex String: A Octal String: 12 Binary String: 1010Weitere Erweiterungen