Verstehen Observer Patterns

Die Observer-Entwurfsmuster können mehrere Beobachter Objekte benachrichtigt werden, wenn ein Subjekt-Objekt in irgendeiner Weise verändert. Jeder Beobachter registriert sich mit dem Thema, und wenn eine Änderung auftritt, wird das Thema informiert sie alle. Jede der Beobachter ist parallel benachrichtigt (das heißt, zur gleichen Zeit).

Menu

Erstellen einer Subjekt-Schnittstelle

Wenn Sie ein Design-Muster zu implementieren, ist es oft eine gute Idee, durch die Schaffung einer Schnittstelle, um sicherzustellen, zu starten, dass die Objekte, die Sie erstellen, um das Muster haftet das Sie starten versuchen - vor allem, wenn mehrere Objekte beteiligt sind. Die Implementierung dieser Schnittstelle - Programmierung auf eine Schnittstelle, wie es genannt wird - hält Ihren Code in der Linie und in der Regel hält die Dinge klarer.

Wenn Sie die Observer-Muster in den Code setzen sind, eine Schnittstelle oder eine abstrakte Klasse für die observers- eingerichtet werden Sie haben in der Regel mehrere Beobachter, und Sie müssen die Methoden halten sie konsequent umzusetzen.

In diesem Beispiel müssen Sie auch eine Schnittstelle für das Thema einzurichten, das ist es, was die Beobachter Watch- der Betreff-Schnittstelle, die Methoden aufgelistet Themen implementieren müssen. Setzen Sie ein registerObserver Methode hier so, dass das Thema Spur von Beobachtern halten können, die registriert werden soll. Neben Beobachter registrieren, sollten Sie eine Möglichkeit haben, um sie los zu werden, so eine removeObserver Methode hinzufügen. Und es gibt eine notifyObservers Methode, die die Beobachter von einigen Änderungen in Kenntnis wird.

öffentliche Schnittstelle Thema
{
public void registerObserver (Observer o) -
public void removeObserver (Observer o) -
public void notifyObservers () -
}

Diese Schnittstelle sind die Methoden, die Themen wie das Datenbanksystem implementieren sollten. Als nächstes: Die Schnittstelle für die Beobachter.

Erstellen eines Beobachter-Schnittstelle

Aufbau der Observer-Schnittstelle, die von den Beobachtern umgesetzt, sie zu aktivieren, um Benachrichtigungen zu erhalten, ist einfach. Alles, was Sie ist eine Methode benötigen, die, wenn eine neue Meldung (diese Methode Update aufrufen können Sie) bereit aufgerufen wird, ist. In diesem Beispiel übergeben Sie die Datenbankoperation, die durchgeführt wurde (wie "Bearbeiten", "Löschen", "Erstellen" und so weiter) und der Datensatz, der als Zeichenfolgen an die Update-Methode geändert wurde.

public interface Observer
{
public void update (String Operation, String Record) -
}

Wenn Beobachter das Update-Methode implementieren, ist das Thema der Lage, sie den Datensatz zu übergeben, und die Operation beeinträchtigt worden ist, die durchgeführt wurde.

Okay, du bist gut zu gehen. Es ist Zeit, um die Datenbank-Thema zu erstellen, die den Überblick über die Beobachter zu halten wird und sie benachrichtigt werden, wenn es zu einer Änderung gewesen ist.

Erstellen Sie einen Betreff

Das Thema hat zu lassen Beobachter registrieren und hat sie zu benachrichtigen, wenn ein Ereignis eintritt. Nach dem Betreff-Schnittstelle, die drei Methoden ein Thema in diesen Beispielen umzusetzen hat, sind: registerObserver, removeObserver und notifyObservers. Das ist, was die Database-Klasse hat in diesem Beispiel.

Für eine Übersicht über die Beobachter, verwenden Sie einen Java-Vektor namens Beobachter in der Datenbank erstellt worden ist. (Der Typspezifizierer hier, , ist für Java 1.5 oder höher und zeigt an, dass jeder Beobachter Objekt den Observer implementiert Interface-, wenn Sie eine frühere Version von Java verwenden, die Typspezifizierer weglassen.)

import java.util. * -
public class Database implementiert Betreff
{
Private Vector observers-

öffentliche Datenbank ()
{
Beobachter = new Vector
() -
}
.
.
.
}

Wenn Sie einen Vektor zu verwenden, ist Spur von Beobachtern zu halten einfach. Wenn ein Beobachter registrieren will, ruft sie die registerObserver Methode des Subjekts, sich als Objekt übergeben. Das Thema - ein Gegenstand unserer Datenbank Klasse - hat nur, dass Beobachter der Beobachter Vektor in der registerObserver Methode hinzufügen, mithilfe der Add-Methode der Vector-Klasse.

import java.util. * -
public class Database implementiert Betreff
{
Private Vector observers-

öffentliche Datenbank ()
{
Beobachter = new Vector
() -
}

public void registerObserver (Observer o)
{
observers.add (o) -
}
.
.
.
}

Wie wäre es ein Beobachter der Beobachter Vektor zu entfernen? Kein Problem. Wenn Sie ein Objekt aus einem Vektor entfernen möchten, können Sie das Entfernen des Vektors verwenden Methoden- hier ist, wie die in der Datenbank Klasse removeObserver Methode funktioniert:

import java.util. * -
public class Database implementiert Betreff
{
Private Vector observers-

öffentliche Datenbank ()
{
Beobachter = new Vector
() -
}

public void registerObserver (Observer o)
{
observers.add (o) -
}

public void removeObserver (Observer o)
{
observers.remove (o) -
}
.
.
.
}

Wenn der Benutzer tut tatsächlich etwas mit der Datenbank - löscht einen Datensatz, zum Beispiel - er nennt die editRecord Methode des Database-Klasse. Zum Beispiel, zu löschen Datensatz 1, können Sie diese Methode wie folgt aufrufen:

database.editRecord ( "Löschen", "Record 1");

Hier ist, was die editRecord Methode sieht so aus: Wenn diese Methode aufgerufen wird, können Sie es der Datenbankoperation die Sie ausführen möchten passieren und der Datensatz Sie arbeiten möchten, die beide als Zeichenfolgen in diesem Beispiel. Diese Strings werden gespeichert, so dass sie an die Beobachter weitergegeben werden. Nachdem die Strings gespeichert sind, wird die notifyObservers Methode, bis nächstes kommt, rief alle Beobachter zu informieren.

import java.util. * -
public class Database implementiert Betreff
{
Private Vector observers-
private String Betrieb-
private String Aufnahme

öffentliche Datenbank ()
{
Beobachter = new Vector
() -
}
.
.
.
public void editRecord (String Operation, String Datensatz)
{
this.operation = Betrieb-
this.record = Aufnahme
notifyObservers () -
}
}

Hier ist das Fleisch des Codes, der Teil, der jedem Beobachter teilt mit, dass es eine Veränderung gewesen ist: die notifyObservers Methode. Jeder Beobachter implementiert diese Observer-Schnittstelle des Beispiel - was bedeutet, dass es eine Update-Methode hat - so notifyObservers hat nur eine Schleife über alle registrierten Beobachter im Beobachter Vektor, jeder der Update-Methode mit dem Datenbankbetrieb und den betroffenen Datensatz aufrufen.

import java.util. * -
public class Database implementiert Betreff
{
Private Vector observers-
private String Betrieb-
private String Aufnahme
.
.
.
public void notifyObservers ()
{
for (int loopIndex = 0- loopIndex lt; observers.size () - loopIndex ++) {
Beobachter Beobachter = (Observer) observers.get (loopIndex) -
observer.update (Betrieb, record) -
}
}

public void editRecord (String Operation, String Datensatz)
{
this.operation = Betrieb-
this.record = Aufnahme
notifyObservers () -
}
}

Das ist alles, was Sie für Database.java benötigen, das Thema in diesem Beispiel. Das Thema lässt sich Beobachter registrieren, austragen selbst und benachrichtigt, wenn ein Datenbank-Datensatz bearbeitet wurde (die Sie die editRecord Methode mit der Datenbank-Klasse tun). Alles, was noch zu tun, um diese Show zu bekommen auf der Straße die Beobachter selbst zu schaffen.

Menü