Médiateur vs observateur?

27

Quelqu'un peut-il me fournir une réponse canonique sur les différences entre un Observeret un Mediator, et un résumé du moment où vous devez utiliser un modèle par rapport à l'autre?

Je ne sais pas quel genre de situation nécessiterait un Observeret quel type nécessiterait unMediator

Rachel
la source
Je voudrais connaître votre propre idée à ce sujet après 7 ans?
Niing

Réponses:

19

Dans le livre original qui a inventé les termes Observateur et Médiateur, Design Patterns, Elements of Reusable Object-Oriented Software, il est dit que le modèle Mediator peut être mis en œuvre en utilisant le modèle Observateur. Cependant, il peut également être implémenté en faisant en sorte que les collègues (à peu près équivalents aux modèles Subjects of the Observer) aient une référence à une classe Mediator ou à une interface Mediator.

Il existe de nombreux cas où vous souhaitez utiliser le modèle d'observateur, la clé est que sur l'objet ne doit pas savoir quels autres objets observent son état.

Le médiateur est un peu plus spécifique, il évite que les classes communiquent directement mais à travers un médiateur. Cela aide le principe de responsabilité unique en permettant de décharger la communication à une classe qui gère simplement cela.

Un exemple classique de médiateur est dans une interface graphique, où l'approche naïve pourrait conduire à du code sur un événement de clic de bouton disant "si le panneau Foo est désactivé et le panneau Bar a une étiquette disant" Veuillez entrer la date "alors n'appelez pas le serveur, sinon allez-y ", où avec le modèle Mediator, il pourrait dire" Je suis juste un bouton et je n'ai rien à faire avec le panneau Foo et l'étiquette sur le panneau Bar, donc je vais simplement demander à mon médiateur d'appeler le serveur est OK en ce moment. "

Ou, s'il est mis en œuvre en utilisant le modèle d'observateur, le bouton dirait "Hé, observateurs (qui comprendraient le médiateur), mon état a changé (quelqu'un m'a cliqué). Faites quelque chose si vous vous en souciez". Dans mon exemple, cela a probablement moins de sens, mais parfois ce serait le cas, et la différence entre l'Observateur et le Médiateur serait davantage une intention plutôt qu'une différence dans le code lui-même.

psr
la source
Merci, vos exemples ont vraiment aidé à clarifier les différences entre les deux pour moi. Si je vous comprends bien, le modèle d'observateur utilise un système d'abonnement / diffusion de messages pour la communication, tandis que le médiateur est comme une entité globalement accessible dont les objets peuvent interroger des informations.
Rachel
@Rachel - Je décrirais l'observateur comme vous l'avez fait. Le médiateur n'est probablement pas global, mais il est connu de tous les objets de l'ensemble qui auraient communiqué entre eux mais qui passent maintenant par le médiateur. À moins que le médiateur ne soit implémenté en tant qu'observateur, auquel cas il connaît tous ces objets (au moins par le biais de leur interface observable, peut-être directement) mais ils ne le savent pas.
psr
9

Le modèle d'observateur fonctionne bien lorsqu'aucune coordination entre les observateurs n'est nécessaire et que les observateurs relation d' va dans un sens.

Par exemple, laissez les objets B et C observer l'objet A. Lorsque l'objet A déclenche l'événement X, alors l'objet B doit exécuter la méthode Y () et l'objet C doit exécuter la méthode Z (). Si les méthodes BY () et CZ () sont totalement indépendantes et ne nécessitent aucune coordination, alors allez-y et utilisez le modèle d'observateur.

D'un autre côté, si BY () doit être exécuté avant CZ (), alors vous voudrez utiliser le modèle Mediator où le médiateur encapsule cette coordination. Dans ce scénario, le médiateur M observerait l'objet A et aurait des références aux objets B et C. Lorsque A déclenche l'événement X, M gère l'événement et appelle BY () et CZ () dans l'ordre prescrit.

De plus, si les objets A, B et C doivent s'observer, l'utilisation d'un médiateur comme intermédiaire contribuera grandement à découpler ces objets et à éviter le code spaghetti.

Raymond Saltrelli
la source
5

Le Observermodèle est utilisé lorsqu'une action entreprise sur une classe (la classe observée) doit produire une réaction dans une autre classe (la classe d'observation) mais il n'est pas souhaitable que la classe observée soit couplée à la classe d'observation. Il s'agit d'un schéma très courant. L'analyseur XML SAX peut être un bon exemple. Pour utiliser l'analyseur SAX, un client implémente l' ContentHandlerinterface pour «observer» l'opération de l'analyseur. Comme l'analyseur rencontre des éléments du document XML, il appelle des méthodes de ContentHandler. L'analyseur peut invoquer le code client, mais l'analyseur n'est pas couplé au code client.

Le Mediatormodèle est une encapsulation d'un modèle d'utilisation d'un ensemble d'objets. Le code client est uniquement couplé au médiateur, au lieu d'être couplé à plusieurs autres classes. C'est similaire à l'agrégation, sauf que la durée de vie des objets encapsulés est indépendante de la durée de vie du médiateur.

Kevin Cline
la source
1

En termes simples (que j'utilise pour m'en souvenir):

Observateur: à utiliser lorsqu'un objet veut être informé des changements d'état dans un autre (à proprement parler, utiliser des événements est Observateur)

Afin de comprendre le médiateur, je trouve cela plus facile lorsque vous considérez d'abord Facade: Facade regroupe les fonctionnalités de classes distinctes (des sous-systèmes entiers parfois) et fournit cette fonctionnalité dans une seule interface.

Mediator: identique à Facade, sauf qu'il combine les fonctionnalités de toutes les classes agrégées pour produire de nouvelles fonctionnalités. (Bonne explication ici )

Steven Evers
la source