webentwicklung-frage-antwort-db.com.de

Unterschied zwischen Observer, Pub / Sub und Datenbindung

Was ist der Unterschied zwischen Beobachtermuster, Publish/Subscribe und Datenbindung?

Ich habe ein bisschen nach Stack Overflow gesucht und keine guten Antworten gefunden.

Ich bin der Überzeugung, dass die Datenbindung ein Oberbegriff ist und dass es verschiedene Möglichkeiten gibt, sie zu implementieren, z. B. das Observer-Muster oder das Pub/Sub-Muster. Mit dem Observer-Muster aktualisiert ein Observable seine Observer. Mit Pub/Sub können 0-viele Verlage Nachrichten bestimmter Klassen veröffentlichen, und 0-viele Abonnenten können Nachrichten bestimmter Klassen abonnieren.

Gibt es andere Muster für die Implementierung der "Datenbindung"?

153
Jess

Hier ist meine Sicht auf die drei:

Datenbindung

Im Kern bedeutet dies nur, dass der Wert von Eigenschaft X für Objekt Y semantisch an den Wert von Eigenschaft A für Objekt B gebunden ist. Es werden keine Annahmen getroffen, wie Y Änderungen für Objekt B kennt oder zugeführt wird.

Observer oder Observable/Observer

Ein Entwurfsmuster, mit dem ein Objekt die Möglichkeit erhält, andere über bestimmte Ereignisse zu benachrichtigen - in der Regel mithilfe von tatsächlichen Ereignissen, die wie Schlitze im Objekt mit der Form einer bestimmten Funktion/Methode aussehen. Der Observable ist derjenige, der Benachrichtigungen bereitstellt, und der Observer empfängt diese Benachrichtigungen. In .net kann der Observable ein Ereignis anzeigen, und der Observer abonniert dieses Ereignis mit einem "Event-Handler" -förmigen Hook. Es werden keine Annahmen über den spezifischen Mechanismus der Benachrichtigung gemacht, noch über die Anzahl der Beobachter, die ein Beobachter benachrichtigen kann.

Pub/Sub

Ein anderer Name (möglicherweise mit mehr "Broadcast" -Semantik) des Observable/Observer-Musters, der normalerweise einen "dynamischeren" Geschmack impliziert - Beobachter können Benachrichtigungen abonnieren oder abbestellen, und ein Observable kann mehrere Beobachter "ausrufen". In .NET können hierfür die Standardereignisse verwendet werden, da Ereignisse eine Form von MulticastDelegate sind und daher die Übermittlung von Ereignissen an mehrere Abonnenten sowie die Abmeldung unterstützen. Pub/Sub hat in bestimmten Kontexten eine etwas andere Bedeutung und beinhaltet normalerweise mehr "Anonymität" zwischen Ereignis und Ereigniser, was durch eine beliebige Anzahl von Abstraktionen erleichtert werden kann, wobei normalerweise ein "mittlerer Mann" (wie eine Nachrichtenwarteschlange) involviert ist, der alle kennt Parteien, aber die einzelnen Parteien kennen sich nicht aus.

Datenbindung, Redux

In vielen "MVC-ähnlichen" Mustern legt das Observable eine Art "Benachrichtigung über geänderte Eigenschaften" offen, die auch Informationen über die spezifischen geänderten Eigenschaften enthält. Der Beobachter ist implizit, normalerweise vom Framework erstellt, und abonniert diese Benachrichtigungen über eine Bindungssyntax, um ein Objekt und eine Eigenschaft spezifisch zu identifizieren. Der "Ereignishandler" kopiert lediglich den neuen Wert und löst möglicherweise eine Aktualisierungs- oder Aktualisierungslogik aus.

Datenbindung zu Redux

Eine alternative Implementierung für die Datenbindung? Ok, hier ist eine dumme:

  • es wird ein Hintergrundthread gestartet, der ständig die gebundene Eigenschaft eines Objekts überprüft.
  • wenn dieser Thread feststellt, dass sich der Wert der Eigenschaft seit der letzten Überprüfung geändert hat, kopieren Sie den Wert in das gebundene Element.
131
JerKimball

Es gibt zwei Hauptunterschiede zwischen Observer/Observable- und Publisher/Subscriber-Mustern:

  1. Observer/Observable Muster wird meistens auf synchron Weise implementiert, dh das Observable ruft die entsprechende Methode aller seiner Beobachter auf, wenn Ein Ereignis tritt ein. Das Muster Publisher/Subscriber wird meistens auf asynchron Weise (unter Verwendung der Nachrichtenwarteschlange) implementiert.

  2. Im Muster Observer/Observable sind sich die - Beobachter des beobachtbaren bewusst. In Publisher/Subscriber müssen sich Publisher und Subscriber nicht kennen . Sie kommunizieren einfach mit Hilfe von Nachrichtenwarteschlangen.

Wie Sie richtig erwähnt haben, ist die Datenbindung ein Oberbegriff und kann entweder mit der Observer/Observable- oder der Publisher/Subscriber-Methode implementiert werden. Daten sind der Herausgeber/Abonnent.

147
Param

Ich bin ein bisschen amüsiert, dass alle Antworten hier versucht haben, den subtilen Unterschied zwischen Observer- und Pub/Sub-Mustern zu erklären, ohne konkrete Beispiele zu nennen. Ich wette, die meisten Leser wissen immer noch nicht, wie sie eines implementieren sollen, indem sie lesen, dass eines synchron und das andere asynchron ist.

Eine Sache zu beachten ist: Das Ziel dieser Muster ist es, Code zu entkoppeln

Der Beobachter ist ein Entwurfsmuster, bei dem ein Objekt (als Subjekt bezeichnet) eine Liste von Objekten verwaltet, die von ihm abhängen (Beobachter), und diese automatisch über Statusänderungen benachrichtigt.

Beobachtermuster

Dies bedeutet ein observable object hat eine Liste, in der alle observers (normalerweise Funktionen) gespeichert sind. und kann diese Liste durchlaufen und diese Funktionen aufrufen, wenn es eine gute Zeit ist.

siehe dieses Beobachtermuster Beispiel für Details.

Dieses Muster eignet sich, wenn Sie auf Datenänderungen an einem Objekt achten und andere Benutzeroberflächenansichten entsprechend aktualisieren möchten.

Aber die Nachteile sind Observables verwalten nur ein Array, um Beobachter zu behalten (im Beispiel ist das Array observersList).

Es wird NICHT unterschieden, wie das Update ausgelöst wird, da es nur ein notify function, wodurch alle in diesem Array gespeicherten Funktionen ausgelöst werden.

Wenn wir Beobachter anhand verschiedener Ereignisse gruppieren möchten. Wir müssen nur diesen observersList in einen Object ändern

var events = {
    "event1": [handler1, handler2],
    "event2": [handler3]
}

siehe dieses Pubsub-Beispiel für Details.

und die Leute nennen diese Variante als pub/sub. Sie können also verschiedene Funktionen basierend auf dem events auslösen, das Sie veröffentlicht haben.

19
Qiang

Ich bin mit Ihrer Schlussfolgerung zu beiden Mustern einverstanden, aber ich verwende Observable, wenn ich mich im selben Prozess befinde, und ich verwende das Pub/Sub in prozessübergreifenden Szenarien, in denen alle Parteien nur den gemeinsamen Kanal kennen, aber nicht die Parteien .

Ich kenne keine anderen Muster, oder lassen Sie mich so sagen, ich habe für diese Aufgabe nie ein anderes Muster benötigt. Selbst die meisten MVC-Frameworks und Datenbindungsimplementierungen verwenden normalerweise intern das Observer-Konzept.

Wenn Sie an prozessübergreifender Kommunikation interessiert sind, empfehle ich Ihnen:

"Enterprise-Integrationsmuster: Entwerfen, Erstellen und Bereitstellen von Messaging-Lösungen" - http: //www.addison-wesley .de/9780321200686.html

Dieses Buch enthält viele Ideen zum Senden von Nachrichten zwischen Prozessen oder Klassen, die auch für prozessinterne Kommunikationsaufgaben verwendet werden können (es hat mir geholfen, lockerer zu programmieren).

Ich hoffe das hilft!

9
Rafa