Quelqu'un peut-il me fournir une réponse canonique sur les différences entre un Observer
et 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 Observer
et quel type nécessiterait unMediator
design-patterns
Rachel
la source
la source
Réponses:
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.
la source
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.
la source
Le
Observer
modè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'ContentHandler
interface pour «observer» l'opération de l'analyseur. Comme l'analyseur rencontre des éléments du document XML, il appelle des méthodes deContentHandler
. L'analyseur peut invoquer le code client, mais l'analyseur n'est pas couplé au code client.Le
Mediator
modè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.la source
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 )
la source