# Observer vs Listener (GUI-Programmierung)



## Björn Karpenstein (20. Feb 2009)

Hmm was ich mich gerade Frage ... man hat eine Datenquelle die ändert sich und möchte die GUI-Komponenten, die damit verbunden sind, aktualisieren. Hier würde sich ein Observer-Pattern lohnen. Aber ich frage mich gerade... Wie ist das eigentlich mit nem Listener? Also ich adde einfach ActionListener zu den GUI-Komponenten... Ist dass das gleiche?


----------



## Marco13 (20. Feb 2009)

Es ist ähnlich. Bei Observern wird bei einer Änderung einfach eine bestimmte Methode aufgerufen. Bei Listenern wird eine Methode aufgerufen, und der wird ein Event-Objekt übergeben. Im Allgemeinen ist eine Beschränkung auf Observer/Observable zu unflexibel, wenn man z.B. mehrere Datenmodelle hat, oder genauere Informationen braucht, WAS sich an den Daten geändert hat (das ist dann eine Information, die im Event verpackt sein könnte).

Allerdings sollte man bei eigenen Datenmodellen (im allgemeinen!) auch eigene Listener und Events verwenden, und nicht den erstbesten Swing/AWT-Listener für seine Zwecke umbiegen...


----------



## byte (20. Feb 2009)

Marco13 hat gesagt.:


> Im Allgemeinen ist eine Beschränkung auf Observer/Observable zu unflexibel, wenn man z.B. mehrere Datenmodelle hat, oder genauere Informationen braucht, WAS sich an den Daten geändert hat (das ist dann eine Information, die im Event verpackt sein könnte).



Du kannst auch bei Observer / Observable Objekte übergeben, siehe _#notifyObservers(Object)_.

Jedoch würde ich stattdessen lieber die EventBus Library verwenden.


----------



## Marco13 (20. Feb 2009)

Ja, das war vielleicht etwas unpräzise, um den IMHO "wichtigesten" Unterschied rauszustellen (Werfen eines Events vs. aufrufen einer allgemeinen Methode). Es ist eben unschön, wenn man erst anhand des übergebenen Objects (am schlimmsten noch mit irgendwelchen instanceof-Höllen) rauszufinden versucht, WAS eigentlich passiert ist ...


----------



## byte (20. Feb 2009)

Auch Listener sind nichts anderes als eine Realisierung des  Observer Patterns.


----------



## stabil (22. Feb 2009)

Die Unterschiede bestehen eigentlich hauptsächlich darin, dass ein Observer sich den Zustand des geänderten Objektes explizit holt (
	
	
	
	





```
subject.getState()
```
) und Observer dynamisch hinzufügbar/entfernbar sind. Listener werden i.A. statisch hinzugefügt und bekommen eigentlich keine weiteren Informationen über das feuernde Objekt. Listener werden ja für einen bestimmten Event definiert und die 
	
	
	
	





```
handleEvent()
```
 definiert dafür entsprechenden Code.


----------

