Différence entre Observer, Pub / Sub et liaison de données

163

Quelle est la différence entre le modèle Observer , Publish / Subscribe et la liaison de données ?

J'ai cherché un peu sur Stack Overflow et je n'ai trouvé aucune bonne réponse.

Ce que j'en suis venu à croire, c'est que la liaison de données est un terme générique et qu'il existe différentes façons de l'implémenter, comme le modèle Observer ou le modèle Pub / Sub. Avec le modèle Observer, un observable met à jour ses observateurs. Avec Pub / Sub, 0-plusieurs éditeurs peuvent publier des messages de certaines classes et 0-plusieurs abonnés peuvent s'abonner aux messages de certaines classes.

Existe-t-il d'autres modèles de mise en œuvre de la «liaison de données»?

Jess
la source
J'en ai trouvé un autre: vérification sale, c'est ce que fait Angular.js. Plus d'informations ici: stackoverflow.com/questions/9682092/databinding-in-angularjs
Jess

Réponses:

143

Voici mon point de vue sur les trois:

Liaison de données

Essentiellement, cela signifie simplement que «la valeur de la propriété X sur l'objet Y est sémantiquement liée à la valeur de la propriété A sur l'objet B.

Observateur, ou observable / observateur

Un modèle de conception par lequel un objet est imprégné de la capacité d'avertir les autres d'événements spécifiques - généralement effectué à l'aide d'événements réels, qui sont un peu comme des emplacements dans l'objet avec la forme d'une fonction / méthode spécifique. L'observable est celui qui fournit les notifications, et l'observateur reçoit ces notifications. Dans .net, l'observable peut exposer un événement et l'observateur s'abonne à cet événement avec un crochet en forme de "gestionnaire d'événements". Aucune hypothèse n'est faite sur le mécanisme spécifique des notifications, ni sur le nombre d'observateurs qu'une observable peut notifier.

Pub / Sub

Un autre nom (peut-être avec une sémantique plus "broadcast") du modèle Observable / Observer, qui implique généralement une saveur plus "dynamique" - les observateurs peuvent s'abonner ou se désabonner aux notifications et un observable peut "crier" à plusieurs observateurs. Dans .NET, on peut utiliser les événements standard pour cela, car les événements sont une forme de MulticastDelegate, et peuvent donc prendre en charge la livraison d'événements à plusieurs abonnés, ainsi que la désinscription. Pub / Sub a une signification légèrement différente dans certains contextes, impliquant généralement plus d '"anonymat" entre l'événement et l'événementiel, ce qui peut être facilité par un certain nombre d'abstractions, impliquant généralement un "intermédiaire" (comme une file d'attente de messages) qui sait tout parties, mais les parties individuelles ne se connaissent pas.

Liaison de données, Redux

Dans de nombreux modèles de type «MVC», l'observable expose une sorte de «notification de modification de propriété» qui contient également des informations sur la propriété spécifique modifiée. L'observateur est implicite, généralement créé par le framework, et souscrit à ces notifications via une syntaxe de liaison pour identifier spécifiquement un objet et une propriété, et le "gestionnaire d'événements" copie simplement la nouvelle valeur dessus, déclenchant potentiellement toute logique de mise à jour ou d'actualisation.

Liaison de données concernant Redux

Une implémentation alternative pour la liaison de données? Ok, en voici une stupide:

  • un thread d'arrière-plan est démarré qui vérifie constamment la propriété liée sur un objet.
  • si ce thread détecte que la valeur de la propriété a changé depuis la dernière vérification, copiez la valeur dans l'élément lié.
JerKimball
la source
J'apprécie votre réponse et j'essaie de mettre en œuvre une idée différente de liaison de données.
Jess
@jessemon heh, pas de problème; le modèle d'observateur est certainement la meilleure approche "abstraite" que je connaisse, mais mon horrible petit exemple "ferait également une liaison de données", bien que de manière chaotique et inefficace.
JerKimball
7
Honnêtement, j'en ai marre d'entendre "pub / sub aka the observer pattern", ce n'est pas du tout la même chose. Pub / sub est un système d'événements, le modèle d'observateur utilise un système d'événements pour publier les événements AUTOMATIQUEMENT lors du changement d'objet. Si vous émettez manuellement des événements chaque fois que vous modifiez un objet, vous n'utilisez pas le modèle d'observateur.
BT
154

Il existe deux différences majeures entre les modèles Observer / Observable et Publisher / Subscriber:

  1. Le modèle d' observateur / observable est principalement implémenté de manière synchrone , c'est-à-dire que l'observable appelle la méthode appropriée de tous ses observateurs lorsqu'un événement se produit. Le modèle Publisher / Subscriber est principalement implémenté de manière asynchrone (à l'aide de la file d'attente de messages).

  2. Dans le modèle Observateur / Observable , les observateurs sont conscients de l'observable . Alors que, dans Éditeur / Abonné , les éditeurs et les abonnés n'ont pas besoin de se connaître . Ils communiquent simplement à l'aide de files d'attente de messages.

Comme vous l'avez mentionné correctement, la liaison de données est un terme générique et elle peut être implémentée à l'aide de la méthode Observer / Observable ou Publisher / Subscriber. Data est l'éditeur / abonné.

Param
la source
7
Je lisais des applications Web JavaScript par O'Reilly ( shop.oreilly.com/product/0636920018421.do ). Au chapitre 2, Alex implémente un en pub/subutilisant des événements JS. C'est un type d'implémentation de rappel, mais c'est un exemple synchrone .
Jess
5
Je n'ai pas lu le livre mais s'il était implémenté en utilisant des "événements" JS, ce serait asynchrone puisque les événements sont asynchrones par définition.
Param
3
Salut Jess, bien sûr que vous avez raison. Il n'y a pas de définition standard pour ces termes 😊
Param
14
Généralement, une observable a une liste d'observateurs avec elle (elle itère sur cette liste pour envoyer un événement à tous). Un éditeur n'a généralement connaissance que d'une file d'attente dans laquelle il publie ses événements / messages. Il ne sait pas combien de consommateurs se sont abonnés à cette file d'attente.
Param
7
Pour moi, c'est la différence cruciale entre les deux: De plus, dans le modèle d'observateur, les observateurs sont conscients de l'observable. Alors que dans Pub / Sub, ni les éditeurs, ni les consommateurs n'ont besoin de se connaître. Ils communiquent simplement à l'aide de files d'attente de messages. Très bonne réponse!
maryisdead le
23

Je suis un peu amusé que toutes les réponses ici essayaient d'expliquer la différence subtile entre les modèles Observer et Pub / Sub sans donner d'exemples concrets. Je parie que la plupart des lecteurs ne savent toujours pas comment mettre en œuvre chacun d'eux en lisant l'un est synchrone et l'autre est asynchrone.

Une chose à noter est: le but de ces modèles est d'essayer de découpler le code

L'observateur est un modèle de conception dans lequel un objet (appelé sujet) maintient une liste d'objets en fonction de lui (observateurs), les notifiant automatiquement de tout changement d'état.

Modèle d'observateur

Cela signifie qu'un observable objecta une liste où il garde tous sesobservers (qui sont généralement des fonctions). et peut parcourir cette liste et invoquer ces fonctions quand il se sent bien.

voir ce modèle d'observateur exemple de pour plus de détails.

Ce modèle est utile lorsque vous souhaitez écouter toute modification de données sur un objet et mettre à jour d'autres vues de l'interface utilisateur en conséquence.

Mais les Cons sont observables ne conservent qu'un seul tableau pour garder les observateurs (dans l'exemple, le tableau estobserversList ).

Il ne différencie PAS la façon dont la mise à jour est déclenchée car elle n'en a qu'un notify function , qui déclenche toutes les fonctions stockées dans ce tableau.

Si nous voulons regrouper les gestionnaires d'observateurs en fonction de différents événements. Nous avons juste besoin de modifier cela observersListen un Objectcomme

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

voir cet exemple de pubsub pour plus de détails.

et les gens appellent cette variation comme pub/sub. Ainsi, vous pouvez déclencher différentes fonctions en fonction du fichier que eventsvous avez publié.

Qiang
la source
Eh bien, c'est une réponse bien meilleure, concise et claire. :)
CoderX
À un niveau élevé, j'ai toujours dit que le sous-marin de pub est le modèle d'observateur, mais avec tout, il a des saveurs différentes.
Grim
9

Je suis d'accord avec votre conclusion sur les deux modèles, néanmoins, pour moi, j'utilise Observable lorsque je suis dans le même processus et j'utilise le Pub / Sub dans des scénarios inter-processus, où toutes les parties ne connaissent que le canal commun mais pas les parties .

Je ne connais pas d'autres modèles, ou laissez-moi dire de cette façon, je n'ai jamais eu besoin d'un autre modèle pour cette tâche. Même la plupart des frameworks MVC et des implémentations de liaison de données utilisent généralement en interne le concept d'observateur.

Si vous êtes intéressé par la communication inter-processus, je vous recommande:

"Modèles d'intégration d'entreprise: conception, création et déploiement de solutions de messagerie" - http://www.addison-wesley.de/9780321200686.html

Ce livre contient beaucoup d'idées sur la façon d'envoyer des messages entre des processus ou des classes qui peuvent être utilisés même dans des tâches de communication intra-processus (cela m'a aidé à programmer de manière plus lâche).

J'espère que ça aide!

Rafa
la source