Proxy

Proxy est un patron de conception (design pattern), il s’agit d’une classe se substituant à une autre classe. Le proxy implémente la même interface que la classe à laquelle il se substitue.

Utilisation

En se substituant à une autre classe le Proxy permet de contrôler l’accès aux méthodes d’une classe. Il est aussi utilisé pour simplifier l’utilisation d’un objet pouvant être complexe. Un Proxy implémente une, et une seule interface.

Exemple

Pour illustrer ce patron de conception, prenons le cas d’une personne qui démarre une voiture. Si cette personne est mineur l’accès est refusé.

Commençons par créer l’interface IVoiture et d’une classe TVoiture. La méthode de la classe écrit simplement dans la console comme quoi la voiture est démarrée.

Ensuite nous ajoutons le conducteur, à la création l’age est obligatoire.

Pour finir, la création du Proxy qui implémente l’interface IVoiture et donc la méthode Démarrer. Le Proxy se substitue à la TVoiture et ajoute une limite d’age.

type
  IVoiture = interface
  ['{187B8759-24F8-4EE9-BBB9-AC6805EAB7C6}']
    procedure Demarrer;
  end;
 
  TVoiture = class(TInterfacedObject, IVoiture)
    procedure Demarrer;
  end;
 
  TConducteur = record
  strict private
    FNom: string;
    FPrenom: string;
    FAge: integer;
  public
    constructor Create(aNom, aPrenom: string; aAge: integer);
    property Age: integer read FAge write FAge;
  end;
 
  TProxyVoiture = class(TInterfacedObject, IVoiture)
  strict private
    FConducteur: TConducteur;
    FVoiture: IVoiture;
  public
    constructor Create(aConducteur: TConducteur);
    procedure Demarrer;
  end;
 
procedure TVoiture.Demarrer;
begin
  Writeln('La voiture est démarrée');
end;
 
{ TConducteur }
 
constructor TConducteur.Create(aNom, aPrenom: string; aAge: integer);
begin
  FNom := aNom;
  FPrenom := aPrenom;
  FAge := aAge;
end;
 
{ TProxyVoiture }
 
constructor TProxyVoiture.Create(aConducteur: TConducteur);
begin
  FConducteur := aConducteur;
  FVoiture := TVoiture.Create;
end;
 
procedure TProxyVoiture.Demarrer;
begin
  if FConducteur.Age >= 18 then
    FVoiture.Demarrer
  else
    Writeln('Le conducteur est trop jeune pour conduire');
end;

Pour tester l’appel à ces classes, voici le code source :

var
  ProxyVoiture: IVoiture;
begin
  try
    ProxyVoiture := TProxyVoiture.Create(TConducteur.Create('Pierre', 'Dupont', 16));
    ProxyVoiture.Demarrer;
 
    ProxyVoiture := TProxyVoiture.Create(TConducteur.Create('Jean', 'Dupont', 42));
    ProxyVoiture.Demarrer;
 
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*