web-dev-qa-db-fra.com

Différence entre modèle d'observateur et approche événementielle

J'ai toujours trouvé le modèle Observer presque similaire à l'approche habituelle axée sur les événements. En fait, j'ai presque cru qu'il s'agissait en réalité de noms différents faisant référence à la même chose. Ils utilisent tous les deux des concepts similaires pour avoir quelque chose en tant qu'auditeur et même dans l'implémentation, ils sont presque identiques, c'est-à-dire qu'ils ont une méthode/fonction de rappel pour effectuer une action. C'est au moins en Java.

Dans d’autres langues, telles que Actionscript/Flex, Actions sont plus conviviaux et peuvent donner l’impression de ne pas se limiter au modèle d’observateur. Mais encore, les concepts sonnent les mêmes.

Mais est-ce réellement vrai? Le modèle Observer est-il identique au style de programmation habituel basé sur les événements?

52
Carven

Le modèle d'observateur est un cas très spécial. Event-Driven peut signifier n'importe quoi. Dans la plupart des implémentations de Pattern Observer, Observer est un objet surveillant l'observé. Lorsque l'observé est changé, une méthode de l'observateur est appelée. Strictement parlant, ce n'est pas un "événement". Cela signifie que différentes actions sur l'observé conduisent généralement à l'appel de différentes méthodes dans l'observateur. La sémantique "ce qui" a changé est dans la méthode . Dans Event Driven Systems, vous avez essentiellement un objet/une méthode qui consomme et le message ce qui a été modifié ou ce qui est arrivé dans l'événement. Cela peut être n'importe quoi et n’est pas limité à l’idée d’observer quelque chose! Cela signifie que dans un système piloté par les événements, vous obtenez une nouvelle sémantique en ajoutant de nouveaux types d'événements. Dans un modèle Observer, vous ajoutez généralement une sémantique en ajoutant une méthode à la classe Observer. CEPENDANT: personne ne vous empêche d'implémenter Observer en tant que liste spéciale de ChangeEvents. 

31
Angel O'Sphere

Quand il y a un changement d'état chez l'éditeur ou le sujet, 

  • Architecture pilotée par les événements (architecture pilotée par les messages), chargée de remettre message à l'abonné, de manière asynchrone.

  • Observer Pattern (est un modèle de conception logicielle), chargé de commander Subscriber de faire quelque chose de manière synchrone.

20
Zeigeist

La différence numéro 1 est peut-être que Event-Systems a toujours un flux d’événement qui sépare les observables de ses observateurs afin que les événements ne puissent pas les atteindre immédiatement. Tandis que les véritables observables appellent directement des méthodes d'observateur, les observables pilotés par les événements déposent leurs événements dans une file d'événements. Ensuite, l'EDT transmet ces événements aux écouteurs enregistrés.

10
Spacerat

Programmation événementielle est un terme pour définir un paradigme. tandis que Modèle observable est une solution de conception pour réaliser une application événementielle.

À votre santé!

9
dheeran

Je l’essaye très simplement, parce que cela m’a également aidé une fois.

Il suffit de penser en tant qu'observateur et observable. Au lieu que l'observable marque un ensembleChanged et que l'observateur demande à l'observable ce qui a changé, l'observable diffuse plutôt un objet (Event Carried State) avec toutes les informations pertinentes sur le changement apporté aux observateurs. Il y a donc en réalité une instance supplémentaire entre Observer et Observable.

http://www.grahambrooks.com/event-driven-architecture/patterns/stateful-event-pattern/

1
AnnaKlein

En résumant plusieurs réponses à cette question, cet article de hackernoon et ma propre expérience, la principale différence entre le modèle Observer et l'événement piloté par les événements (Pub-Sub, par exemple) est, selon moi, le suivant:

Dans le modèle Observer, Observed conserve les références à ses observers.

Tandis que dans Pub-Sub, le diffuseur n’a aucune idée de qui est son auditeur. (Ou même si quelqu'un est là pour écouter.) Listener peut s’attendre à des données du diffuseur, mais n’a aucune idée de la provenance exacte de l’événement. Peut-être que cela vient de plusieurs classes ou de systèmes distants. Peut être pas. Cela n'a pas d'importance pour le radiodiffuseur ou l'auditeur.

Cela ne veut pas dire que ces choses sont très différentes. En outre, il existe des implémentations qui se comportent comme l'un ou l'autre.

Par exemple, le wisper rubygem vous permet d'agir comme un motif Observer ou un motif Pub-Sub en fonction de vos besoins. Vous pouvez même utiliser les deux ensemble si vous le souhaitez.

1
thekingoftruth

J'ai un peu cherché la même question. Pour ce fil, je trouve un point d’Angel O'Sphere sur "Quelle sémantique" et un point de Spacerat sur "Dispatcher" qui aide.

Je crois comprendre que ces deux points distinguent Even-Driver du modèle Observer. Selon l'explication canonique au moins, "Modèle d'observateur" représente généralement une diffusion immédiate une fois que le "Sujet" a été modifié et que le "Dispatching" est mis en oeuvre en appelant l'interface fournie par l'abonné ou l'auditeur. Tandis que pour Event-Driven, il y a toujours une autre couche entre "Subject et" Observer ". Appelée" Dispatcher "ou utilisation de" Event Queue ". les interfaces dépendent du type d'événement différent. 

1
user2189731

La différence fondamentale dans les deux est le couplage et le comportement synchrone. Si nous nous en tenons au modèle d’observateur, nous disons qu’il n’existe qu’une source de signal et qu’il serait synchrone, tandis que d’autre part, nous découplons les deux parties pour qu’elles travaillent de manière indépendante tout en prévoyant la possibilité de disposer de plusieurs sources de données. les événements à l'avenir sans aucun changement de code. Les événements nous aident à adopter une conception asynchrone. Toutes les bibliothèques de programmation réactives fournissent un très bon support pour la conception événementielle.

1
Rahul Garg

De Wikipedia :

Le motif observateur est un motif de conception logicielle dans lequel un objet, appelé le sujet, maintient une liste de ses dépendants, appelée observateurs et les avertit automatiquement de tout changement d'état, généralement en appelant l’une de leurs méthodes.

Il est principalement utilisé pour implémenter des systèmes de gestion d'événements distribués, dans logiciel "événementiel". La plupart des langages modernes tels que Java et C # ont construit dans "événement" construit qui implémente le modèle d'observateur composants, pour la programmation facile et code court.

L'observateur pattern est un peu plus abstrait et théorique. Les événements sont un (généralement intégré) implementation, cependant, comme indiqué dans la réponse d'Angel, les événements ont tendance à pouvoir être utilisés dans quelques situations autres que ce qui est strictement défini dans le modèle d'observateur.

0
iliketocode

Oui, ils sont principalement les mêmes.

Les événements ressemblent à un modèle de modèle d'observateur "intégré" pour certaines langues.

Ainsi, vous n’implémenterez pas vraiment le modèle d’observateur dans un langage prenant en charge les événements car ils fournissent déjà ce que vous recherchez.
D'autre part, vous pouvez écrire en utilisant le modèle d'observateur dans des langues dépourvues d'événements.

0
Matthias