![]() |
||
| OOP |
Objekt
Polymorphie
Interface
|
|
|
Ereignisse |
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.