Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: TObjectList<T> und Comparer

  Alt 27. Jan 2015, 21:31
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat