Hier mal ein kleines Beispiel mit Interfaces
Wir habe da einen Dienst, der uns einen ganz simplen Text liefert.
Delphi-Quellcode:
unit DatenHoler;
interface
type
IDatenHoler =
interface
['
{4C5405CE-04AF-43C0-BB06-00C1051C12D8}']
function HoleDaten:
string;
end;
implementation
end.
Konkret bekommen wir diese Daten per HTTP geliefert und es dauert pro Abfrage eine Sekunde bis wir die Daten bekommen.
Delphi-Quellcode:
unit HttpDatenHoler;
interface
uses
DatenHoler;
type
THttpDatenHoler =
class( TInterfacedObject, IDatenHoler )
public
function HoleDaten:
string;
end;
implementation
uses
System.SysUtils;
{ THttpDatenHoler }
function THttpDatenHoler.HoleDaten:
string;
begin
Sleep( 1000 );
Result := '
Hier sind die Daten ' + DateTimeToStr( Now );
end;
end.
Das ganze sieht dann so aus:
Delphi-Quellcode:
procedure BenutzeDatenHoler( ADatenHoler: IDatenHoler );
var
LIdx: Integer;
begin
for LIdx := 1 to 10 do
begin
Write( DateTimeToStr( Now ), ': ' );
Writeln( ADatenHoler.HoleDaten );
end;
end;
procedure Start;
var
LDatenHoler: IDatenHoler;
begin
Writeln( 'Direkte Anfrage an den DatenHoler' );
LDatenHoler := THttpDatenHoler.Create;
BenutzeDatenHoler( LDatenHoler );
end;
Ist ja ganz witzig, aber irgendwie dauert mir jede Abfrage zu lange, aber in meiner Anwendung merken will ich mir das trotzdem nicht ... egal, wir haben ja gegen ein Interface programmiert und machen einfach mal das hier:
Delphi-Quellcode:
unit CachedDatenHoler;
interface
uses
DatenHoler;
type
TCachedDatenHoler =
class( TInterfacedObject, IDatenHoler )
private
FDatenHoler: IDatenHoler;
FHasCachedData: Boolean;
FCachedData:
string;
public
constructor Create( ADatenHoler: IDatenHoler );
function HoleDaten:
string;
end;
implementation
{ TCachedDatenHoler }
constructor TCachedDatenHoler.Create( ADatenHoler: IDatenHoler );
begin
inherited Create;
FDatenHoler := ADatenHoler;
end;
function TCachedDatenHoler.HoleDaten:
string;
begin
if not FHasCachedData
then
begin
FCachedData := FDatenHoler.HoleDaten;
FHasCachedData := True;
end;
Result := FCachedData;
end;
end.
Und ändern (nur) den Start wie folgt ab:
Delphi-Quellcode:
procedure Start;
var
LDatenHoler: IDatenHoler;
begin
Writeln( 'Cache Anfrage an den DatenHoler' );
LDatenHoler := THttpDatenHoler.Create;
LDatenHoler := TCachedDatenHolder.Create( LDatenHoler );
BenutzeDatenHoler( LDatenHoler );
end;
Schon gehts nach der ersten Abfrage ab wie der Wind und meine Anwendung musste ich auch nicht ändern
Man beachte, dass der
TCachedDatenHoler
keinerlei Kenntnis von dem
THttpDatenHoler
hat, der eigentlich die Daten besorgt. Da macht ein Interface dann richtig Spass.