Als ich das letzte Mal den Beobachtermodus untersucht habe, heißt es in vielen Artikeln, dass er auch als Abonnement/Veröffentlichung bezeichnet wird (Veröffentlichung/Abonnement -Modus). In dem Buch "JavaScript Design Muster" gibt es jedoch immer noch einige Unterschiede zwischen den beiden Mustern. Die ursprünglichen Wörter im Buch sind wie folgt:
1. Observer -Modus erfordert Beobachter, die Themenbenachrichtigungen erhalten möchten, müssen Ereignisse abonnieren, bei denen sich der Inhalt ändert.
2.Subscribe/Publish -Modus verwendet einen Thema/Event -Kanal, der zwischen Abonnenten und Verlag liegt. Mit dem Ereignissystem können Code bestimmte Ereignisse für die Anwendung definieren, mit der benutzerdefinierte Parameter übergeben werden können, die die vom Abonnenten erforderlichen Werte enthalten. Ziel ist es, Abhängigkeiten zwischen Abonnenten und Verlegern zu vermeiden.
Der Unterschied zum Beobachtermodus besteht darin, dass jeder Abonnent geeignete Ereignishandler ausführen können, um Benachrichtigungen von Verlage zu registrieren und zu empfangen.
Ok, ich weiß nicht, wie ich so mächtig sein soll. Hier ist mein Verständnis:
1. Im Beobachtermodus ist das Zielobjekt für die Aufrechterhaltung des Beobachters verantwortlich. Im Veröffentlichung/Abonnement -Modus kümmern sich die Verlage nicht um Abonnenten, sondern sind nur dafür verantwortlich, Nachrichten herauszuwerfen und in Ruhe zu lassen.
2. Im Beobachtermodus muss der Beobachter eine Schnittstelle bereitstellen und dann diese Schnittstelle aufrufen, wenn sich das Zielobjekt ändert, um seinen eigenen Zustand und den Zielzustand konsistent zu halten. Das heißt, alle Beobachter müssen über eine einheitliche Schnittstelle verfügen (z. B. muss die oben geschriebene Aktualisierungsmethode mit diesem Namen bezeichnet werden). Im Veröffentlichung/Abonnement -Modus beruht das Auslösen des Abonnentenereignisses nicht auf einer solchen Schnittstelle, sondern wird vom Abonnenten durch Anhören einer bestimmten Nachricht ausgelöst (diese Nachricht enthält im Allgemeinen den vom Abonnenten erforderlichen Namen und Parameter). Es ist zu verstehen, dass der Abonnent den Verlag nicht hört, sondern den Message Pool. Solange es eine Nachricht gibt, die sich im Nachrichtenpool kümmert, löst sie das Ereignis aus, egal wer die Nachricht in der Vergangenheit veröffentlicht hat. Verlage und Abonnenten sind entkoppelt.
Das Folgende ist die Implementierung des Veröffentlichung/Abonnement -Modus in JS. Kopieren und fügen Sie es in die Konsole ein und Sie werden es nach dem Versuch verstehen:
Die Codekopie lautet wie folgt:
var pubSub = (function () {
var q = {}
Themen = {},
subuid = -1;
// eine Nachricht veröffentlichen
Q.Publish = Funktion (Thema, args) {
if (! Themen [Thema]) {return;}
var subs = themen [thema],
len = subs.length;
während (len--) {
subs [len] .func (Thema, Argumente);
}
gib dies zurück;
};
// Ereignisse abonnieren
Q.Subscribe = Funktion (Thema, func) {
Themen [Thema] = Themen [Thema]? Themen [Thema]: [];
var token = (++ subuid) .ToString ();
Themen [Thema] .push ({{
Token: Token,
Func: Func
});
Rückgabe -Token;
};
return q;
// Abbestellen und aufhören zu schreiben, zu durchqueren, Themen zu durchqueren, und dann das Token zurückzugeben, indem Sie das vorherige Speichern löschen, das angegebene Element löschen
}) ();
// ausgelöstes Ereignis
var logmsg = Funktion (Themen, Daten) {
console.log ("Protokollierung:" + themen + ":" + data);
}
// Hören Sie sich die angegebene Meldung 'MSGName' an
var sub = PubSub.SubScribe ('msgname', logMSG);
// veröffentlichte eine Nachricht 'msgname'
PubSub.Publish ('msgname', 'Hallo Welt');
// veröffentlichte eine nicht börsennotierte Nachricht 'msgname1'
pubSub.publish ('oothmsgname', 'me auch!');