155 votes

Modèle de conception d'observateur contre "écouteurs".

Il me semble que le modèle de conception Observer tel qu'il est décrit dans GOF est en fait la même chose que les Listeners que l'on trouve dans diverses boîtes à outils. Y a-t-il une différence entre les concepts, ou les Listeners et les Observers sont-ils vraiment la même chose ?

(Je ne cherche pas une implémentation spécifique du langage informatique, je veux juste comprendre la différence (si elle existe) du point de vue de la conception. Oui, je sais qu'il y a plusieurs réponses à des questions similaires sur SOF, mais elles sont ancrées dans des questions spécifiques sur des langages spécifiques -- je cherche une réponse de conception, pas une réponse de langage).

19 votes

Dans le premier cas, un code surveille le mouvement de l'autre code, tandis que dans le second, un code écoute l'autre code pour détecter tout bruit.

3 votes

Que signifie le sigle GOF ?

6 votes

@dekaru Gang of Four : fr.wikipedia.org/wiki/Design_Patterns

65voto

Derek Greer Points 3260

Le fait que le terme "listener" fasse référence au pattern Observer ou non dépend du contexte. Par exemple, les "Event Listeners" de Java Swing font partie de l'implémentation du modèle Observer alors que les "Trace Listeners" de .Net ne le sont pas.

Il n'est pas rare que les auteurs de frameworks attribuent des noms différents aux composants participant à l'implémentation d'un pattern donné, mais les noms officiels des patterns sont généralement utilisés lors des discussions sur les patterns eux-mêmes.

En ce qui concerne la conception, la mise en œuvre d'un modèle donné sera souvent influencée par le langage et la plate-forme utilisés. Ainsi, une implémentation particulière du pattern Observer dans un framework donné (qui peut utiliser le terme "listener" pour décrire le rôle du ConcreteObserver) peut différer légèrement de celle décrite dans le livre Design Patterns.

0 votes

Vous avez mentionné que les " Trace Listeners " de .NET ne font pas partie du modèle Observer. De quoi s'agit-il ?

1 votes

Je ne sais pas si vous demandez à quoi ils servent ou à quel modèle ils appartiennent. Les TraceListeners de .Net sont juste des puits enfichables pour écrire un flux de messages de log (par exemple, écrire à la console, écrire au fichier, écrire au journal des événements, etc.) En termes de modèles, alors que la fonctionnalité globale de trace de .Net emploie plusieurs modèles (Plugin, Iterator), boucler sur une collection d'objets qui se conforment tous à la même interface est vraiment juste un polymorphisme ordinaire. Les TraceListeners eux-mêmes ne sont pas concernés par les changements d'état d'un objet observé, donc ce n'est pas vraiment le modèle de l'observateur.

0 votes

Merci pour l'explication, c'est exactement ce dont j'avais besoin.

31voto

Richard Werezak Points 588

La description d'Observer dans Design Patterns de Gamma et al. (GoF).

Dans leur description de l'observateur, l'un des ConcreteObservers pourrait signaler un changement à son sujet. Le sujet, qui détient une liste de tous les observateurs concrets, notifie alors sa liste. Tous les observateurs concrets, y compris le moteur principal, réagissent alors comme il convient.

Les implémentations courantes de Listeners semblent toutes réagir à des événements provenant de l'extérieur.

Je dirais donc que l'auditeur est un cas moins généralisé d'observateur.

2 votes

Dans le modèle GoF Observer, le sujet informe les observateurs d'un changement de son propre état. Ainsi, "State Observer" est en fait un nom plus descriptif pour le modèle. Il permet également aux observateurs, comme vous l'avez décrit, d'agir sur le sujet. Ainsi, bien que les Listeners semblent moins généraux dans ce sens, je pense qu'ils sont aussi plus généraux dans le sens où ils réagissent à tout type d'événement, et pas seulement à un changement d'état du sujet qui les intéresse.

3voto

Mike Points 475

Un listener peut très bien être une implémentation du pattern observer. Un listener attend essentiellement qu'un événement se produise sur un objet donné, ce que fait un observateur.

Je sais que vous ne cherchez pas une réponse spécifique à une langue, mais il est difficile de parler de ce genre de choses dans l'abstrait. Donc, si je devais étudier cette question en .NET, j'aurais tendance à ouvrir une assemblée contenant un listener dans .NET Reflector, ce qui me permettra de désassembler l'assemblée et de vérifier sa logique par rapport à un design pattern.

1 votes

"Un écouteur attend essentiellement qu'un événement se produise sur un objet donné, ce que fait un observateur" pas exactement, selon le livre DP, les observateurs n'attendent pas un quelconque événement, mais un changement dans l'état du sujet, que l'observateur peut alors interroger (pull). Peut-être que "State Observer" serait un nom plus précis pour ce modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X