Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Zwei Klassen möglichst "OOP" kommunuzieren las

  Alt 4. Sep 2006, 22:35
HI,
ich glaube dein Bild vom Observerpattern ist noch etwas falsch. Ein Event ist etwas das man in diesem Pattern als Observable bezeichnen würde. Sauberer OOP ist es hier auf Zeiger zu verzichten und stattdessen eine Basisklasse mit der aufzurufenden Methode zu erstellen.
Der Observer selbst ist kein zwischengeschaltetes Element. Du hast eine spezielle Klasse, die Events auslösen kann. Dies ist das Observable. Geschieht hier etwas bestimmtes, gibt sie allen registrierten Observern bescheid. Damit steht auch fest, sie muss Möglichkeiten zum registrieren und deregistrieren so wie zum Benachrichtigen haben.
Die andere Art von Klasse sind die Observer. Diese haben eine definierte Schnittstelle über die ihnen ein Ereignis mitgeteilt wird. Du hast also eigentlich nur zwei Klassen (und nicht direkt etwas dazwischen).

Ein grobes Beispiel könnte dass sein:
Delphi-Quellcode:
TAbstractA = class
  public
    // Abstrakte Methode die zur Benachrichtigung über ein Ereignis aufgerufen wird
    // Das Ereignis geht aus den übergebenen Parametern hervor
    procudure OnFoo(...); virtual; abstract;
end;

TA1 = class(TAbstractA)
  public
    // Konkrete Behandlung bei Benachrichtigung über Ereignis
    procudure OnFoo(...); override;
end;

TA2 = class(TAbstractA)
  public
    // Andere konkrete Behandlung bei Benachrichtigung über Ereignis
    procudure OnFoo(...); override;
end;

...

TObservable = class
  private
    // Liste aller Observer
    FObserver : TObjectList; // kann natürlich auch anders aussehen
  protected
    // Methode die alle registrierten Observer benachrichtigt
    // hier kann dann einfach über FObserver iteriert werden
    procedure notifyObserver(...);
  public
    procedure registerObserver(const Observer : TAbstractA);
    procedure deregisterObserver(const Observer : TAbstractA);
end;
Ja, wie du hier siehst, wären die konkreten As einfache Observer. Alle diese Objekte sind Nachfahren von TAbstractA und können sich damit beim Observable registrieren. Registrierte Klassen können nun einfach benachrichtigt werden. Man muss nur die Liste durchlaufen und bei jedem Observer die Methode onFoo aufrufen. Aus den hier übergebenen Argumenten geht dann hervor, was genau pasiert ist. Natürlich kannst du hier auch mehr als ein Ereignis mit ganz anderen Parametern beobachten.
Das ganze ist relativ analog zur Benachrichtigung durch Methodenzeiger. Hier hast du allerdings einen deutlich mehr OOP Weg und ein einfaches Beispiel für die Umsetzung des Observerpattern!

Gruß Der Unwissende
  Mit Zitat antworten Zitat