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öchten wir eine automatische Bereitstellungsfunktion entwerfen, genau wie bei der Entwicklung von Eclipse, solange die Datei geändert wird, bereitet Eclipse die geänderte Datei automatisch auf dem Server bereit. 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 feststellen, dass es in der Klasse einen Vektorbehälter gibt, der das Observer-Objekt speichert (der Grund, warum Vektor anstelle der Liste verwendet wird, ist, dass Vector bei Multi-Thread-Operationen sicher ist, während die Liste unsicher ist). Dieser Vektorbehälter ist der Kern der Beobachterklasse. Es gibt drei weitere Methoden: Die Anhangsmethode besteht darin, diesem Behälter das Observer -Objekt hinzuzufügen. 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.
Beispiel für Beobachtermodus
Betreffschnittstelle
public interface -Betreff {public void RegisterObserver (Beobachter O); public void RemoveObserver (Beobachter O); public void musifyAlloBservers ();}Beobachterschnittstelle
öffentliche Schnittstelle Beobachter {public void Update (Betreff);}Die Hunter -Klasse implementiert die Subjektoberfläche
Import Java.util.ArrayList; Public Class Headhunter implementiert das Thema {// Definieren Sie eine Liste von Benutzern wie Mike, Bill usw. Private ArrayList <Beerver> UserList; private arrayList <string> Jobs; public Headhunter () {userList = new ArrayList <Beerverver> (); Jobs = New ArrayList <String> (); } @Override public void RegisterObserver (Beobachter o) {userList.add (o); } @Override public void removeObServer (Beobachter o) {} @Override public void notifyAlloBServers () {für (Observer O: UserList) {O.Update (this); }} public void addjob (String Job) {this.jobs.add (Job); notifyAlllobServers (); } public arrayList <string> getJobs () {return Jobs; } public String toString () {return Jobs.toString (); }}Jobsucher ist ein Beobachter:
öffentlicher Klassen Jobseeker implementiert Observer {private String -Name; public Jobseeker (String -Name) {this.name = name; } @Override public void update (Betreff s) {System.out.println (this.name + "wurde benachrichtigt!"); // Auftragsliste system.out.println (s); }}Beginnen Sie an:
public class main {public static void main (String [] args) {headhunter hh = new Headhunter (); HH.registerObserver (neuer Jobsucher ("Mike"); HH.registerObserver (neuer Jobsucher ("Chris"); HH.registerObserver (neuer Jobsucher ("Jeff"); // Jedes Mal, wenn Sie einen Job hinzufügen, können alle Jobs benachrichtigt werden. hh.addjob ("Google Job"); HH.Addjob ("Yahoo Job"); }} 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.