OOP Objekt Polymorphie Ereignisse Interface
Pfad: Startseite / Fächer / Informatik / Objektorientierte Modellierung / OOP / Ereignisse
Autor: mk
06.02.2007 19:10:02
1838
Ereignisse

Selbstdefinierte Ereignisse mit Objekten

Eine flexible Lösung des MVC-Konzepts macht erforderlich, dass sich das 'model' bei den 'views' bei Veränderung selbstständig meldet. Ein dauerndes 'Polling' der 'views' beim 'model' soll vermieden werden. So soll z.B. eine Ampelsteuerung nach Ablauf des Timers für eine Phase die Aktualisierung der Views auslösen. In Sprachen wie Delphi oder C# lässt sich das Problem durch eine prozedurale Variable z.B. OnChange elegant lösen. In Java gibt es keine prozeduralen Variablen, hier muss man sich etwas Anderes ausdenken.

An einem kleinen Delphi-Projekt - das sich 1:1 nach Java übertragen lässt - soll das Vorgehen erläutert werden. Statt einer prozeduralen Variablen ist OnChange jetzt eine Objektreferenz auf eine Update-Objekt. Ein solches Update-Objekt muss nun eine Methode z.B. update haben, die das eigentliche Update durchführt. Jetzt ist es ja gerade der Clou des MVC-Konzepts, dass beim Entwurf des 'models' eben nicht bekannt ist, was hier zu tun ist. Dh. update wird als eine abstrakte virtuelle Methode deklariert, die später überschrieben wird. Wegen der - eventuellen - späteren Eweiterung ist OnChange vom Typ TUpdate0.

....
type
  TUpdate0 = class(TObject)
  protected
    procedure update; virtual; abstract;
  end;
....

Das Auslösen des Ereignisses geschieht durch

if OnChange <> nil then OnChange.update;

dh. eine fehlende Ereignisbehandlung (eine nicht vorhandenes Update-Objekt) stellt kein Problem dar.

Ein View kann nun auf folgende Weise eine Ereignisbehandlung implementieren. Zuerst muss die TUpdate0-Klasse erweitert werden:

....
type
  TUpdate = class(TUpdate0)
  private
    procedure update; override;
  end;
....
procedure TUpdate.update;
begin
  with Form1 do
  begin
    lAus.Caption := IntToStr(model.GetZahl);
  end;
end;
....

Dann muss als kleine Unbequemlichkeit ein Update-Objekt erzeugt und am Ende vernichtet werden.

....
  private
   ...
    event : TUpdate;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
  model := TZahl.Create;
  event := TUpdate.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  event.Free;
  model.Free;
end;
....

Das Update-Objekt ist für die Update-Ereignisbehandlung zuständig. Die Referenz auf dieses Objekt wird dann mit

model.SetOnChange(event);

zum 'model' gesendet. Die Zuordnung Ereignis-Ereignisbehandlung ist auch während der Laufzeit flexibel möglich.

Kleines Test-Projekt

ereignis.zip

Links

Valid XHTML 1.0! lokal