Observer Design Pattern vs "Listeners"


136

Es scheint mir, dass das in GOF beschriebene Observer-Entwurfsmuster wirklich dasselbe ist wie das, das Listener in verschiedenen Toolkits gefunden haben. Gibt es einen Unterschied zwischen den Konzepten oder sind Zuhörer und Beobachter wirklich dasselbe?

(Ich suche keine bestimmte Implementierung einer Computersprache, ich möchte nur den Unterschied (falls vorhanden) aus gestalterischer Sicht verstehen. Ja, ich weiß, dass es mehrere Antworten auf ähnliche Fragen zu SOF gibt, aber sie sind verwurzelt bei bestimmten Fragen zu bestimmten Sprachen - Ich suche eine Designantwort, keine Sprachantwort.)


19
Im ersten Fall überwacht ein Code den anderen Code auf Bewegung, während im zweiten Code der andere Code auf Rauschen wartet.
nate c

2
Wofür steht GOF?
Dekaru

Antworten:


60

Ob sich der Begriff "Zuhörer" auf das Beobachtermuster bezieht oder nicht, hängt vom Kontext ab. Beispielsweise sind die "Ereignis-Listener" von Java Swing Teil einer Observer-Musterimplementierung, die "Trace-Listener" von .NET jedoch nicht.

Es ist nicht ungewöhnlich, dass Framework-Autoren Komponenten, die an einer bestimmten Musterimplementierung teilnehmen, unterschiedliche Namen zuweisen. Die offiziellen Musternamen werden jedoch im Allgemeinen verwendet, wenn die Muster selbst diskutiert werden.

In Bezug auf das Design wird die Implementierung eines bestimmten Musters häufig von der verwendeten Sprache und Plattform beeinflusst. Daher kann eine bestimmte Implementierung des Observer-Musters innerhalb eines bestimmten Frameworks (die möglicherweise den Begriff "Listener" verwendet, um die Rolle des ConcreteObservers zu beschreiben) geringfügig von der im Buch "Entwurfsmuster" beschriebenen abweichen.


26

Die Beschreibung von Observer in Design Patterns von Gamma et al. al. (GoF).

In ihrer Beschreibung von Observer könnte einer der ConcreteObserver eine Änderung seines Betreffs signalisieren. Der Betreff, der eine Liste aller ConcreteObserver enthält, benachrichtigt dann seine Liste. Alle ConcreteObserver, einschließlich der Antriebsmaschine, reagieren dann entsprechend.

Die gemeinsamen Implementierungen von Listenern scheinen alle auf Ereignisse von außen zu reagieren.

Ich würde also sagen, dass der Listener ein weniger allgemeiner Fall eines Beobachters ist.


4

Ein Zuhörer kann durchaus eine Implementierung des Beobachtermusters sein. Ein Zuhörer wartet im Wesentlichen darauf, dass ein Ereignis an einem bestimmten Objekt auftritt, was ein Beobachter tut.

Ich weiß, dass Sie nicht nach einer sprachspezifischen Antwort suchen, aber es ist schwierig, abstrakt über dieses Zeug zu sprechen. Wenn ich dies in .NET untersuchen würde, wäre ich geneigt, eine Assembly mit einem Listener in .NET Reflector zu öffnen, damit ich die Assembly zerlegen und ihre Logik anhand eines Entwurfsmusters überprüfen kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.