Verstehen Observer Patterns

Verstehen Observer Patterns - Dummies

Das Observer-Entwurfsmuster ermöglicht die Benachrichtigung mehrerer Betrachterobjekte, wenn ein Betreffobjekt in irgendeiner Weise geändert wird. Jeder Beobachter registriert sich mit dem Subjekt, und wenn eine Änderung eintritt, benachrichtigt das Subjekt sie alle. Jeder der Beobachter wird parallel (dh zur gleichen Zeit) benachrichtigt.

Erstellen einer Benutzerschnittstelle

Wenn Sie ein Entwurfsmuster implementieren, ist es oft sinnvoll, zunächst eine Schnittstelle zu erstellen, um sicherzustellen, dass die von Ihnen erstellten Objekte dem Muster entsprechen, das Sie verwenden möchten - insbesondere, wenn mehrere Objekte sind beteiligt. Wenn Sie diese Schnittstelle implementieren - indem Sie eine Schnittstelle so programmieren, wie sie genannt wird - bleibt Ihr Code in einer Linie und sorgt normalerweise für mehr Übersichtlichkeit.

Wenn Sie das Observer-Muster in den Code einfügen, richten Sie eine Schnittstelle oder eine abstrakte Klasse für die Beobachter ein. Sie haben in der Regel mehrere Beobachter, und Sie müssen die implementierten Methoden konsistent halten.

In diesem Beispiel müssen Sie auch eine Schnittstelle für das Thema einrichten, was die Beobachter beobachten. Die Subject-Schnittstelle listet die Methoden auf, die die Probanden implementieren müssen. Setzen Sie hier eine registerObserver-Methode ein, damit das Subjekt Beobachter verfolgen kann, die registriert werden möchten. Neben der Registrierung von Beobachtern sollten Sie eine Möglichkeit haben, sie loszuwerden, also fügen Sie eine removeObserver-Methode hinzu. Und es gibt eine Methode notifyObservers, die die Beobachter über eine Änderung informiert.

public interface Betreff
{
public void registerObserver (Beobachter o);
public void removeObserver (Beobachter o);
public void notifyObservers ();
}

Diese Schnittstelle listet die Methoden auf, die Subjekte wie das Datenbanksystem implementieren sollten. Weiter oben: Die Schnittstelle für die Beobachter.

Erstellen einer Observer-Schnittstelle

Die Erstellung der Observer-Schnittstelle, die von den Beobachtern implementiert wird, um ihnen zu ermöglichen, Benachrichtigungen zu erhalten, ist einfach. Alles, was Sie brauchen, ist eine Methode, die aufgerufen wird, wenn eine neue Benachrichtigung bereit ist (Sie können diese Methodenaktualisierung aufrufen). In diesem Beispiel übergeben Sie die ausgeführte Datenbankoperation (z. B. "Bearbeiten", "Löschen", "Erstellen" usw.) und den Datensatz, der als Zeichenfolge in die Aktualisierungsmethode geändert wurde.

public interface Beobachter
{
public void update (String-Operation, String-Datensatz);
}

Wenn Beobachter die Aktualisierungsmethode implementieren, kann der Betreff den betroffenen Datensatz und die ausgeführte Operation übergeben.

Okay, du bist gut zu gehen. Es ist an der Zeit, den Betreff der Datenbank zu erstellen, der die Beobachter im Auge behalten und sie benachrichtigen wird, wenn eine Änderung stattgefunden hat.

Einen Betreff erstellen

Der Betreff muss Beobachter registrieren lassen und muss sie benachrichtigen, wenn ein Ereignis eintritt. Gemäß der Subject-Schnittstelle müssen die drei Methoden, die ein Subjekt in diesen Beispielen implementieren muss, registerObserver, removeObserver und notifyObservers sein. Das ist was die Database-Klasse in diesem Beispiel tut.

Um die Beobachter im Auge zu behalten, verwenden Sie einen Java-Vektor namens Beobachter, der im Datenbankkonstruktor erstellt wurde. (Der Typbezeichner hier, ist für Java 1. 5 oder höher und gibt an, dass jedes Observer-Objekt die Observer-Schnittstelle implementiert. Wenn Sie eine frühere Version von Java verwenden, lassen Sie den Typbezeichner weg.)

importiert Java. Nutz. *;
public class Datenbank implementiert Betreff
{
private Vector Beobachter;

öffentliche Datenbank ()
{
Beobachter = neuer Vector ();
}
.
.
.
}

Wenn Sie einen Vektor verwenden, ist es einfach, den Überblick über Beobachter zu behalten. Wenn sich ein Beobachter registrieren möchte, ruft er die registerObserver-Methode des Subjekts auf und übergibt sich selbst als ein Objekt. Das Subjekt - ein Objekt unserer Database-Klasse - muss diesen Beobachter lediglich zum Beobachtervektor in der registerObserver-Methode hinzufügen, indem die Add-Methode der Vector-Klasse verwendet wird.

importiert Java. Nutz. *;
public class Datenbank implementiert Betreff
{
private Vector Beobachter;

öffentliche Datenbank ()
{
Beobachter = neuer Vector ();
}

public void registerObserver (Beobachter o)
{
Beobachter. addiere (o);
}
.
.
.
}

Wie wäre es, einen Beobachter aus dem Beobachtervektor zu entfernen? Kein Problem. Wenn Sie ein Objekt aus einem Vektor entfernen möchten, können Sie die remove-Methode des Vektors verwenden. So funktioniert das in der removeObserver-Methode der Database-Klasse:

Importieren von Java. Nutz. *;
public class Datenbank implementiert Betreff
{
private Vector Beobachter;

öffentliche Datenbank ()
{
Beobachter = neuer Vector ();
}

public void registerObserver (Beobachter o)
{
Beobachter. addiere (o);
}

public void removeObserver (Beobachter o)
{
Beobachter. Entferne (o);
}
.
.
.
}

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

Datenbank. editRecord ("löschen", "Datensatz 1");

So sieht die Methode editRecord aus: Wenn diese Methode aufgerufen wird, übergeben Sie ihr die Datenbankoperation, die Sie ausführen möchten, und den Datensatz, an dem Sie arbeiten möchten, beide in diesem Beispiel als Strings. Diese Strings werden gespeichert, damit sie an die Beobachter weitergegeben werden können. Nachdem die Strings gespeichert wurden, wird die nextify-Methode aufgerufen, um alle Beobachter zu benachrichtigen.

importiert Java. Nutz. *;
public class Datenbank implementiert Betreff
{
private Vector Beobachter;
private String-Operation;
privater String-Datensatz;

öffentliche Datenbank ()
{
Beobachter = neuer Vector ();
}
.
.
.
public void editRecord (String-Operation, String-Datensatz)
{
this.Operation = Betrieb;
dies. Datensatz = Datensatz;
notifyObservers ();
}
}

Hier ist das Fleisch des Codes, der Teil, der jedem Beobachter mitteilt, dass eine Änderung stattgefunden hat: die Methode notifyObservers. Jeder Beobachter implementiert die Observer-Schnittstelle dieses Beispiels - was bedeutet, dass er eine Aktualisierungsmethode hat -, so dass notifyObservers nur alle registrierten Beobachter im Beobachtervektor durchlaufen muss, wobei die Aktualisierungsmethode jedes Benutzers mit der Datenbankoperation und dem betroffenen Datensatz aufgerufen wird.

importiert Java. Nutz. *;
public class Datenbank implementiert Betreff
{
private Vector Beobachter;
private String-Operation;
privater String-Datensatz;
.
.
.
public void notifyObservers ()
{
für (int loopIndex = 0; loopIndex Beobachter Beobachter = (Beobachter) Beobachter. get (Schleifenindex);
Beobachter. Aktualisieren (Vorgang, Aufzeichnung);
}
}

public void editRecord (String-Operation, String-Datensatz)
{
this. Betrieb = Betrieb;
dies. Datensatz = Datensatz;
notifyObservers ();
}
}

Mehr brauchen Sie nicht für die Datenbank. Java, das Thema in diesem Beispiel. Der Betreff lässt Beobachter sich registrieren, sich selbst abmelden und benachrichtigt werden, wenn ein Datenbankdatensatz bearbeitet wurde (was Sie mit der editRecord-Methode der Database-Klasse tun). Alles, was noch zu tun ist, um diese Show auf die Straße zu bringen, ist es, die Beobachter selbst zu schaffen.