Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Programmier-Pattern OBSERVER (https://www.delphipraxis.net/171545-programmier-pattern-observer.html)

Jonas Shinaniganz 12. Nov 2012 08:49


Programmier-Pattern OBSERVER
 
Liste der Anhänge anzeigen (Anzahl: 1)
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)
:shock: :shock: :shock: :shock: schauen auf -> :-D

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
Delphi-Quellcode:
FAZ.SendNewspaperToAllSubs;
benachrichtigen.

Die FAZ muss auch Abonnenten löschen und hinzufügen können. Dafür gibt es 2 Funktionen. Beispiel:
Delphi-Quellcode:
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: Anhang 38051



Falls ich etwas unklar erklärt habe könnt Ihr fragen. Fehler meinerseits sind nicht
ausgeschlossen.

Grüße.

Sir Rufo 12. Nov 2012 09:08

AW: Programmier-Pattern OBSERVER
 
Ohne deinen Beitrag schmälern zu wollen möchte ich doch auf 2 Seiten im Netz hinweisen:

http://www.philipphauer.de/study/se/design-pattern.php (deutsch)
(Beispiel Sourcen für Java was aber nicht so stört, da gut erklärt)

(irgendwie erinnert mich das von dir angeführte Beispiel an diese Seite ;))

und

http://sourcemaking.com/design_patterns (englisch)
(teilweise auch mit Delphi Beispielen)

EDIT

Wo ich doch gerade mal dein UML-Diagramm anschaue, stelle ich fest, dass es direkt von Philip Hauer kommt.
Somit solltest du vorsichtig bzgl. des Urheberrechts sein, wenn du das veröffentlichst.
Dem Vortragenden kann man vorwerfen (wenn er es nicht gemacht hat) keine Quellenangabe gemacht zu haben (denn sonst wüsstest du ja, woher diese Bilder stammen)

EDIT2:

Zitat:

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 Pull-Version gewählt. (FAZ benachrichtigt Abonnenten)
Also hast du die Push Variante gewählt

Jonas Shinaniganz 12. Nov 2012 10:16

AW: Programmier-Pattern OBSERVER
 
Stimmt, da ist auch die Abbildung in besserer Qualität zu finden, die Seite sieht auf den ersten Blick sehr gut aus. Sehr warscheinlich hat mein Kollege da gespickt.

Jedenfalls ist hier von mir eine Delphi-Implementation und eine Erklärung mit eigenen Worten.

Danke für die Links.

Edit: Fehler korrigiert.

Ich frage bei Gelegenheit nach, bzgl. Quelle und Rechte.
Ansonsten werde ich eine "abgeleitete" Abbildung in Vektorformat erstellen.

Daniel 12. Nov 2012 11:13

AW: Programmier-Pattern OBSERVER
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1190817)
Ich frage bei Gelegenheit nach, bzgl. Quelle und Rechte.
Ansonsten werde ich eine "abgeleitete" Abbildung in Vektorformat erstellen.

Das wäre wichtig - denn Stand hier und jetzt ist es ein fremdes Bild, welches hier ohne Rücksprache mit dem Autor veröffentlicht wird.

Stevie 12. Nov 2012 12:23

AW: Programmier-Pattern OBSERVER
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich finde, für das Observer Pattern eignet sich hervorragend die Benutzung eines Multicast Events.

In dem gezeigten Beispiel sieht man ja sehr schön, dass der Kontrakt eigentlich nur die GetNewspaper Methode ist.
Das ganze geht ein bisschen in Richtung EBCs, was für Delphianer ja im Grunde nix sonderlich Neues ist.

Der Vorteil dabei ist, dass keine Abhängigkeit auf ein Interface gegeben ist (sieht man in meinem angehangenen Beispiel) - da der Kontrakt ja nur besagt "ich brauche eine GetNewspaper Methode". Wer die wie oder wo implementiert, ist uninteressant.

Auch der Publisher braucht kein spezielles Interface Implementieren, denn das Multicast Event ist im Grunde nix anderes als das Observer Pattern, was über Komposition an Stelle von Vererbung realisiert ist.

Ob man nun zu DSharp greift oder es auf dem herkömmlichen Weg löst, bleibt einem selber überlassen - habe mal beide Wege gezeigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz