Heim  >  Artikel  >  Java  >  Spezifische Analyse des Beobachtermusters in Java-Entwurfsmustern

Spezifische Analyse des Beobachtermusters in Java-Entwurfsmustern

黄舟
黄舟Original
2017-08-10 09:32:041259Durchsuche

Dieser Artikel stellt Ihnen das Java-Entwurfsmuster des Beobachtermusters des Verkehrs vor, das eine Eins-zu-Viele-Abhängigkeitsbeziehung zwischen Objekten definiert, sodass jedes Objekt seinen Zustand ändert. Das Folgende ist eine Einführung in das Beobachtermuster von Java-Entwurfsmustern anhand von Klassendiagrammen und Beispielcodes. Interessierte Freunde sollten es sich gemeinsam ansehen

Definition: Definieren Sie eine Eins-zu-Viele-Abhängigkeitsbeziehung zwischen Objekten , sodass bei jeder Zustandsänderung eines Objekts alle davon abhängigen Objekte automatisch benachrichtigt und aktualisiert werden.

Typ: Verhaltensklassenmuster

Klassendiagramm:

In Softwaresystemen gibt es häufig eine solche Anforderung: Wenn ein Objekt Wenn das Bei Zustandsänderungen müssen einige damit verbundene Objekte ebenfalls entsprechende Änderungen vornehmen. Beispielsweise möchten wir eine Rechtsklick-Menüfunktion entwerfen. Solange Sie mit der rechten Maustaste in den gültigen Bereich der Software klicken, wird ein Menü für ein weiteres Beispiel angezeigt. Wir möchten eine automatische Bereitstellung entwerfen Funktion: Genau wie bei der Entwicklung von Eclipse stellt Eclipse die geänderten Dateien automatisch auf dem Server bereit, solange die Datei geändert wird. Diese beiden Funktionen haben eine Ähnlichkeit, das heißt, ein Objekt muss das andere Objekt jederzeit überwachen und sobald sich sein Status ändert, muss es entsprechende Maßnahmen ergreifen. Tatsächlich gibt es viele Lösungen, die dies erreichen können, aber es besteht kein Zweifel daran, dass die Verwendung des Beobachtermodus eine gängige Wahl ist.

Struktur des Beobachtermusters

Im grundlegendsten Beobachtermuster sind die folgenden vier Rollen enthalten:

  •  Beobachter: Wie Sie dem Klassendiagramm entnehmen können, verfügt die Klasse über einen Vector-Container, der zum Speichern von Beobachterobjekten verwendet wird (der Grund, warum Vector anstelle von List verwendet wird, liegt darin, dass Vector (bei Multithread-Operationen sicher ist , während List unsicher ist), ist dieser Vektorcontainer der Kern der Beobachterklasse, und es gibt drei weitere Methoden: Die Attach-Methode dient zum Hinzufügen eines Beobachterobjekts zu diesem Container und die Detach-Methode zum Verschieben aus dem Container zum Beobachterobjekt; die Benachrichtigungsmethode besteht darin, die entsprechende Methode des Beobachterobjekts nacheinander aufzurufen. Diese Rolle kann eine Schnittstelle, eine abstrakte Klasse oder eine konkrete Klasse sein. Da sie häufig mit anderen Mustern gemischt wird, werden häufig abstrakte Klassen verwendet.

  •  Beobachter: Die Beobachterrolle ist im Allgemeinen eine Schnittstelle, die nur eine Aktualisierungsmethode hat. Diese Methode wird ausgelöst und aufgerufen, wenn sich der Zustand des Beobachters ändert.

  •  Spezifischer Beobachter: Diese Rolle wird verwendet, um die Erweiterung zu erleichtern, und in dieser Rolle kann eine spezifische Geschäftslogik definiert werden.

  •  Spezifischer Beobachter: Eine spezifische Implementierung der Beobachterschnittstelle. In dieser Rolle wird die Logik definiert, die verarbeitet werden soll, wenn sich der Zustand des beobachteten Objekts ändert.

Observer-Mustercode-Implementierung


abstract class Subject { 
  private Vector<Observer> obs = new Vector<Observer>(); 
  public void addObserver(Observer obs){ 
    this.obs.add(obs); 
  } 
  public void delObserver(Observer obs){ 
    this.obs.remove(obs); 
  } 
  protected void notifyObserver(){ 
    for(Observer o: obs){ 
      o.update(); 
    } 
  } 
  public abstract void doSomething(); 
} 
class ConcreteSubject extends Subject { 
  public void doSomething(){ 
    System.out.println("被观察者事件反生"); 
    this.notifyObserver(); 
  } 
} 
interface Observer { 
  public void update(); 
} 
class ConcreteObserver1 implements Observer { 
  public void update() { 
    System.out.println("观察者1收到信息,并进行处理。"); 
  } 
} 
class ConcreteObserver2 implements Observer { 
  public void update() { 
    System.out.println("观察者2收到信息,并进行处理。"); 
  } 
} 
public class Client { 
  public static void main(String[] args){ 
    Subject sub = new ConcreteSubject(); 
    sub.addObserver(new ConcreteObserver1()); //添加观察者1 
    sub.addObserver(new ConcreteObserver2()); //添加观察者2 
    sub.doSomething(); 
  } 
}

Laufende Ergebnisse

Das beobachtete Ereignis wird widergespiegelt

Beobachter 1 empfängt die Informationen und verarbeitet sie.

Beobachter 2 empfängt die Informationen und verarbeitet sie.

Aus den laufenden Ergebnissen können Sie ersehen, dass wir nur die Subject-Methode aufgerufen haben, gleichzeitig aber auch die zugehörigen Methoden der beiden Beobachter gleichzeitig aufgerufen wurden. Schauen Sie sich den Code genauer an. Es ist eigentlich nichts anderes, als die Observer-Klasse in der Subject-Klasse zu verknüpfen und die Update-Methode des Observers in der doSomething-Methode zu durchlaufen.

Vorteile des Beobachtermusters

Es besteht eine leichte Beziehung zwischen dem Beobachter und dem Beobachteten und sind abstrakt gekoppelt, was das Erweitern für beide erleichtert.

Der Beobachtermodus ist ein häufig verwendeter Triggermechanismus. Er bildet eine Triggerkette und verarbeitet die Methoden jedes Beobachters nacheinander. Gleichzeitig ist dies jedoch auch ein Mangel des Beobachtermodus. Da es sich um einen Kettenauslöser handelt, sind Leistungsprobleme besorgniserregender. Darüber hinaus kommt es in der Kettenstruktur leichter zu Zirkelverweisfehlern, die zum Einfrieren des Systems führen.

Zusammenfassung

In der Java-Sprache gibt es eine Schnittstelle Observer und ihre Implementierungsklasse Observable nützlich für Beobachter Rollen werden oft wahrgenommen. Wir können die Verwendung dieser beiden Klassen in der JDK-API-Dokumentation überprüfen.

Freunde, die VC++, JavaScript DOM oder AWT entwickelt haben, sind von ihrer Ereignisverarbeitung begeistert. Nachdem Sie das Beobachtermuster verstanden haben, werden Sie ein gewisses Verständnis für die Prinzipien des Ereignisverarbeitungsmechanismus haben. Wenn Sie die Funktion eines ereignisauslösenden Verarbeitungsmechanismus entwerfen möchten, ist die Verwendung des Beobachtermusters eine gute Wahl. Das Ereignisverarbeitungs-DEM (Delegation Event Model) in AWT wird mithilfe des Beobachtermusters implementiert.

Das obige ist der detaillierte Inhalt vonSpezifische Analyse des Beobachtermusters in Java-Entwurfsmustern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn