AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Programmier-Pattern OBSERVER
Thema durchsuchen
Ansicht
Themen-Optionen

Programmier-Pattern OBSERVER

Ein Thema von Jonas Shinaniganz · begonnen am 12. Nov 2012 · letzter Beitrag vom 12. Nov 2012
Antwort Antwort
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz
Registriert seit: 30. Aug 2011
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.
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!

Geändert von Jonas Shinaniganz (12. Nov 2012 um 14:34 Uhr)
 
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#2
  Alt 12. Nov 2012, 10:08
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

Geändert von Sir Rufo (12. Nov 2012 um 10:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

 
Delphi XE5 Ultimate
 
#3
  Alt 12. Nov 2012, 11:16
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.

Geändert von Jonas Shinaniganz (12. Nov 2012 um 11:19 Uhr)
  Mit Zitat antworten Zitat
Daniel

 
Delphi 10.4 Sydney
 
#4
  Alt 12. Nov 2012, 12:13
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.
Daniel R. Wolf
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#5
  Alt 12. Nov 2012, 13:23
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.
Angehängte Dateien
Dateityp: zip Observer.zip (1,5 KB, 141x aufgerufen)
Stefan

Geändert von Stevie (12. Nov 2012 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 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