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»?
model-view-controller
design-patterns
data-binding
observer-pattern
publish-subscribe
Jess
la source
la source
Réponses:
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:
la source
Il existe deux différences majeures entre les modèles Observer / Observable et Publisher / Subscriber:
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).
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é.
la source
pub/sub
utilisant des événements JS. C'est un type d'implémentation de rappel, mais c'est un exemple synchrone .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
Cela signifie qu'un
observable object
a 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 est
observersList
).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
observersList
en unObject
commevoir 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 queevents
vous avez publié.la source
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!
la source