Kurz & Gut Observer-Pattern von Tim Rademacher Einführung Das Observer-Pattern in Java Design Pattern sind Beschreibungen von Lösungen für oft vorkommende Software-Design Probleme. Design Pattern müssen den Kontext, das Problem und die Lösung darstellen. Sie können ein Ziel beim Refactoring sein, unflexible Software wird umorganisiert. Das Interface Observer wird von Beobachtern implementiert enthält nur die MethodenDeklaration für die update-Methode. Die Klasse Observable ist die Superklasse von Beobachteten. Sie speichert ihre Beobachter in einem Vector und besitzt Methoden zum Design Patterns beinhalten Erfahrung von Design hinzufügen, entfernen von Beobachtern. Experten. Durch ein gemeinsames Design Innerhalb der notifyObservers-Methode werden Vokabular wird einfache Kommunikation und die update-Methoden der Beobachter aufgerufen. Dokumentation ermöglicht. Die Änderung des Objekt-Zustands wird nach außen hin mitgeteilt. Ein Beispiel, der Vortrag public class Erzaehler extends Observable { V public void erzaehle(String info){ if(countObservers()>0){ setChanged(); notifyObservers(info); } } Vortragender } Zuhörer 1 Zuhörer 2 Zuhörer 3 public class Zuhoerer implements Observer { Zuhörer x public void update(Observable o, Object info) { if(isNeuigkeit(info)){ merken(info); } } Es gibt einen aktiven Erzähler, dieser ist ist beobachtbar (engl. Observable), er macht keine Unterscheidung zwischen den Zuhörern und hört auf, wenn keiner zuhört. Dazu kommt eine Anzahl passiver Zuhörer oder Beobachter (engl. Observer), diese sind interessiert an Informationen des Erzählers und reagieren auf diese Informationen. Observable «interface» observers Attach(Observer) Detach(Observer) Notify() Erzaehler Observer Update() for all o in observers { o->Update() } observable Zuhoerer subjectState GetState() SetState() oberverState return subjectState Update() observerState = observable->getState() http://www.se.uni-hannover.de } Events beim Java AWT Bei der Interaktion des Benutzers mit den Komponenten der grafischen Oberfläche werden Events/Ereignisse gesendet. Die Applikation reagiert auf die Events. Alle Events der grafischen Oberfläche sind eine Unterklasse der abstrakten Klasse AWTEvent. Um die Anzahl der Event-Klassen klein zu halten werden ähnliche Ereignissen zu Gruppen zusammengefasst. Ereignisquellen (z.B. JButton) können Events aussenden. Die EventListener sind an den Events interessiert und melden sich bei der EventSource an. Stand: 11.02.2005 Kurz & Gut: Observer-Pattern Bei auftretenden Events Informiert die EventSource alle registrierten EventListener. Es gibt für jedes Event eine eigene Listener Klasse. Delegates und Events in .NET .NET bietet die eigenen Programmkonstrukte Delegates und Events, zum Benutzen des Observer-Patterns. Delegates übermitteln Funktionszeiger von Ereignis-Konsumenten zu -Produzenten. Die Delegate-Felder sind zur besseren Kapselung als event deklariert. Nur die Klasse, die das Event deklariert, kann es auslösen. Der Zugriff von außen ist nur mit += oder -= möglich. Konvention für Event-Handling Delegates: Kein Rückgabewert (void) 1. Parameter, Sender des Events, Typ object 2. Parameter, Event-Parameter, Subklasse von System.EventArgs (wird im Beispiel nicht beachtet) // Erzähler public delegate void ChangeEvent( object src, string s); von Tim Rademacher Ein Signal wird mit einem Slot mit Hilfe der Methode Qobject::connect verbunden. Der 'Meta Object Compiler', ein zusätzlicher Preprozessor, extrahiert die Informationen über Signale und Slots und erzeugt den Verbindungscode. //Erzähler signals: erzaehleInformation(string s); public void erzaehle(string s){ emit erzaehleInformation(s); } //Zuhörer slots: empfangeInformation(string s); public void empfangeInformation(string s){ if(isNeuigkeit(s)){ merken(s); } } //Die Verbindung Qobject::connect(erzaehler, SIGNAL(erzaehleInformation(string)), zuhoerer, SLOT(empfangeInformation(string))); Qt vs. Java vs. .NET public event ChangeEvent onChangeEvent; public void Erzaehle(string information){ if (onChangeEvent != null) onChangeEvent(this, information); } //Zuhörer instanzErzaehler.onChangeEvent += new ChangeEvent(Hoere); public void Hoere(object src, string information) { if(IsNeuigkeit(information)){ Merken(information); } } Signale und Slots in Qt Qt ist eine C++ Klassenbibliothek und ein GUIToolkit, sie stellt zwei Schlüsselwörter zur Benutzung des Observer-Patterns bereit. Das Schlüsselwort signals wird zur Deklaration der Signale benutzt, die Signale müssen nicht Implementiert werden. Sie werden mit emit ausgesendet. Das Schlüsselwort slots dient zur Deklaration der Slots. http://www.se.uni-hannover.de Java .NET Qt Implementierung EventListener Signale und Slots Delegates und Events Codelesbarkeit +, -, da nicht da vertraut vertraut Flexibilität (-), wegen Hierachie +, da simpel +, nur +, nur Konventionen Parameter beachten einhalten Literatur: • Gamma, Helm, Johnson, Vlissides: Design Patterns • http://wwwai.wu-wien.ac.at/~hahsler/research/ diplomarbeit/dipl/node5.html • http://www.dofactory.com/Patterns/PatternObserver.asp x • http://www.galileocomputing.de/openbook/javainsel2/ java_110014.htm • http://www.heise.de/ix/artikel/2002/01/130/ • http://www.fh-wedel.de/~si/seminare/ws99/ Ausarbeitung/kde/kde4.htm • http://www.kde.gr.jp/help/doc/kdevelop/doc/kde_libref/ HTML/event-handling.html Stand: 11.02.2005