Pattern OBSERVER
Hallo,
ich habe mich letzte Woche (nach einem Vortrag von einem Kollegen) hingesetzt und eine Implementation des Observer-Patterns erstellt, die ich hier vorstellen möchte.
Das Observer-Pattern ist dafür da, um eine Beziehung zwischen einem Subjekt und vielen Observern zu beschreiben.
Wenn sich das Subjekt ändert, werden alle Observer auf diese Änderung aufmerksam gemacht.
Beispiel:
(die Forumleser) schauen auf (Jonas)
schauen auf ->
Wenn sich also etwas an meinem Zustand (dem Subjekt-Objekt) verändert, müssen alle, die es intressiert (die Observer-Objekte), davon in Kenntnis gesetzt werden.
Als
UML-Diagramm (habe ich aus dem Vortrag entwendet) gibts folgende Darstellung:
http://www.philipphauer.de/study/se/...eitungV-kl.png
In dem Beispiel meiner Impementation gehe ich von einem Verlag (Zeitschriften-Verlag) und seinen Lesern (den Abonnenten) aus. Die Zeitung ist das Objekt, welches ausgetauscht wird.
Das Subjekt ist der Verlag, die Objekte sind alle Abonnenten. Ganz einfach.
Grundsätzlich lässt sich das Observer in 2 Arten implementieren: Die Push-Version und die Pull-Version. Bei der Push-Version gibt die FAZ die Zeitungen an die Abonnenten raus. Bei der Pull-Version fragen die Abonnenten in gewissen zeitlichen Abständen nach, ob denn schon eine neue Zeitung da ist.
Für meine Implementation habe Ich die
Push-Version gewählt. (FAZ benachrichtigt Abonnenten)
Abstrakte Grundklassen:
1. Es gibt das ISubscriber - Interface, dass alle Abonnenten kenntlich macht. (Die Observer)
2. Den TPublisher, der die Basis aller Verläge (Subjekte) darstellt.
Konkrete Klassen:
1. Der Verlag TFAZ abgeleitet von TPublisher
2. 3 verschiedene Klassen, welche ISubscriber implementieren. (Familie Fischer, Meier und die Firma XY)
Die Variablen sind konkret folgende:
Delphi-Quellcode:
var
FAZ : TFAZ; // das Subjekt
Fischer : TFischer; // einige Objekte
Meier : TMeier;
CompanyXY : TCompanyXY;
Wenn die FAZ möchte, kann sie alle Subscribers per
FAZ.SendNewspaperToAllSubs;
benachrichtigen.
Die FAZ muss auch Abonnenten löschen und hinzufügen können. Dafür gibt es 2 Funktionen. Beispiel:
FAZ.AddSubscriber(Fischer);
Am besten ist es wenn du dir die Sourcen dazu einmal ansiehst und vielleicht mit dem Debugger nachvollziehst, was genau passiert. Es ist nicht sonderklich kompliziert und gut strukturiert.
Sourcen: Observer.rar
Falls ich etwas unklar erklärt habe könnt Ihr fragen. Fehler meinerseits sind nicht
ausgeschlossen.
Grüße.