23 Designmuster Kapitel 13: Java Observer Muster
Definition: Definieren Sie eine Eins-zu-Viele-Abhängigkeit zwischen Objekten, sodass bei jedem Objekt alle Objekte, die davon abhängen, benachrichtigt und automatisch aktualisiert werden.
Typ: Verhaltensmuster
Klassendiagramm:
In Softwaresystemen ist häufig ein Bedarf: Wenn sich der Status eines Objekts ändert, ändern sich einige darausliche Objekte ebenfalls entsprechend.
Zum Beispiel möchten wir eine Menüfunktion mit dem Rechtsklick entwerfen. Solange wir mit der rechten Maustaste in den effektiven Bereich der Software klicken, wird ein Menü angezeigt.
Zum Beispiel müssen wir eine automatische Bereitstellungsfunktion entwerfen, genau wie bei der Entwicklung von Eclipse, solange die Datei geändert wird, wird Eclipse die geänderte Datei automatisch auf dem Server bereitgestellt.
Es gibt eine Ähnlichkeit zwischen diesen beiden Funktionen, dh ein Objekt muss immer ein anderes Objekt überwachen, und solange sich der Zustand ändert, wird entsprechende Maßnahmen ergriffen. Tatsächlich gibt es viele Lösungen, die dies erreichen können, aber die Verwendung des Observer -Modells ist zweifellos eine Mainstream -Wahl.
Die Struktur des Beobachtermusters
Im einfachsten Beobachtermodus sind die folgenden vier Zeichen enthalten:
Beobachter: Aus dem Klassendiagramm können Sie sehen, dass es in der Klasse einen Vektorbehälter gibt, der das Observer -Objekt speichert (der Grund, warum Sie Vektor anstelle von Liste verwenden
Beim Threading ist Vektor sicher, während die Liste unsicher ist. Die Abnahmemethode besteht darin, das Observer -Objekt aus dem Behälter zu entfernen. Die Benachrichtigungsmethode besteht darin, die entsprechenden Methoden des Observer -Objekts nacheinander aufzurufen. Diese Rolle kann eine Schnittstelle, eine abstrakte Klasse oder eine konkrete Klasse sein, da sie in vielen Fällen mit anderen Mustern gemischt wird, sodass es mehr Fälle der Verwendung abstrakter Klassen gibt.
Beobachter: Die Beobachterrolle ist im Allgemeinen eine Schnittstelle, die nur eine Aktualisierungsmethode hat. Wenn sich der Zustand des Beobachters ändert, wird diese Methode aufgerufen.
Spezifischer Beobachter: Diese Rolle wird zur einfachen Expansion verwendet, und in dieser Rolle kann eine spezifische Geschäftslogik definiert werden.
Spezifischer Beobachter: Die spezifische Implementierung der Observer -Schnittstelle. In dieser Rolle wird die Logik verarbeitet, wenn sich der Zustand des beobachteten Objekts ändert.
Implementierung des Beobachtermodus -Code
public abstract Class Subjekt {private vector <observer> obs = new vector <observer> (); public void addobserver (observer obs) {this.obs.add (obs); } public void Delobserver (Beobachter obs) {this.obs.remove (obs); } Protected void benachObServer () {for (observer o: obs) {o.update (); }} public abstract void dosomething (); } public class Concretesubject erweitert das Thema (public void dosomething () {System.out.println ("vom Observer -Ereignis zurückgegeben"); this.notifyObserver (); }} öffentliche Schnittstelle Beobachter {public void update (); } public class ConcreteObServer1 implementiert Observer {public void update () {System.out.println ("Observer 1 empfängt die Nachricht und verarbeitet sie."); }} public class ConcreteObserver2 implementiert Observer {public void update () {System.out.println ("Observer 2 empfängt die Nachricht und verarbeitet sie."); }} öffentliche Klasse Client {public static void main (String [] args) {Subjekt sub = new ConcreteSubject (); sub.addobserver (neuer Betonobser1 ()); // add observer1 sub.addobserver (neuer konkreterobserver2 ()); // observer2 sub.dosomething () hinzufügen; }} Auslaufergebnisse
Das Observer -Ereignis ist umgekehrt und der Beobachter 1 erhält die Informationen und Verfahren.
Observer 2 empfängt die Informationen und verarbeitet sie.
Durch die laufenden Ergebnisse können wir sehen, dass wir nur die Subjektmethode aufrufen, aber die relevanten Methoden beider Beobachter werden gleichzeitig aufgerufen. Wenn Sie sich den Code sorgfältig ansehen, ist er tatsächlich sehr einfach. Es ist nichts weiter als so, wie Sie die Beobachterklasse in der Subjektklasse in Verbindung bringen und die Methode zur Aktualisierung der Beobachter in der Dosenmethode durchqueren.
Vorteile des Beobachtermodus
Der Beobachter und der Beobachter sind leicht verwandt und sind abstrakt gekoppelt, so dass es für beide einfacher zu erweitern ist.
Der Beobachtermodus ist ein häufig verwendeter Triggermechanismus, der eine Triggerkette bildet und die Methoden jedes Beobachters wiederum verarbeitet. Gleichzeitig ist dies auch ein Nachteil des Beobachtermodus. Da es in einer Kette ausgelöst wird, ist das Leistungsproblem, wenn es viele Beobachter gibt, besorgniserregender. Darüber hinaus treten in der Kettenstruktur kreisförmige Referenzfehler wahrscheinlicher auf, wodurch das System vorgenommen wird.
Zusammenfassen
In der Java -Sprache gibt es einen Schnittstellenbeobachter und seine Implementierungsklasse beobachtet, was die Beobachterrolle häufig implementiert. Wir können die Verwendungsmethoden dieser beiden Klassen in der JDK -API -Dokumentation anzeigen.
Freunde, die VC ++, JavaScript DOM oder AWT -Entwicklung gemacht haben, sind alle erstaunlich in Bezug auf ihre Veranstaltungsverarbeitung. Nach dem Verständnis des Beobachtermusters haben sie ein gewisses Verständnis der Prinzipien des Ereignisverarbeitungsmechanismus. Wenn Sie eine Funktion eines Ereignisauslöser -Verarbeitungsmechanismus entwerfen möchten, ist die Verwendung des Observer -Modus eine gute Wahl. Die Ereignisverarbeitung DEM (Delegationsereignismodell) in AWT wird mit dem Observer -Modus implementiert.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.