Pont

Le Pont (Bridge) est un patron de conception de type structurel (càd il défini comment organiser les classes) qui permet de séparer l’interface d’une classe de son implémentation.
L’implémentation peut changer sans impacter celle abstraite (de l’interface) tant qu’elle respecte les mêmes signatures des méthodes.

Exemple

Dans cet exemple prenons le cas d’une clé qui permet d’ouvrir ou fermer une porte.

type
  ICle = interface
  ['{D941F388-313F-4223-AD25-D3E30ABC4033}']
    procedure Ouvrir;
    procedure Fermer;
  end;
 
  TCle = class(TInterfacedObject, ICle)
  public
    procedure Ouvrir;
    procedure Fermer;
  end;
 
  TCleVoiture = class(TInterfacedObject, ICle)
  public
    procedure Ouvrir;
    procedure Fermer;
  end;

L’implémentation des deux classe est simple et différente.

{ TCle }
 
procedure TCle.Fermer;
begin
  Writeln('La clé est tournée à gauche');
end;
 
procedure TCle.Ouvrir;
begin
  Writeln('La clé est tournée à droite');
end;
 
{ TCleVoiture }
 
procedure TCleVoiture.Fermer;
begin
  Writeln('Appuie sur le bouton fermer');
end;
 
procedure TCleVoiture.Ouvrir;
begin
  Writeln('Appuie sur le bouton ouvrir');
end;

Ensuite avec cette clé, nous allons ouvrir une porte.

TPorte = class
strict private
  FCle: ICle;
public
  constructor Create(aCle: ICle);
  procedure OuvrirPorte;
  procedure FermerPorte;
end;

La porte ne va pas créer la clé, nous allons passer par une injection de dépendance.

{ TPorte }
 
constructor TPorte.Create(aCle: ICle);
begin
  inherited Create;
 
  if aCle= nil then
    raise Exception.Create('La clé est obligatoire');
 
  FCle := aCle;
end;
 
procedure TPorte.FermerPorte;
begin
  FCle.Fermer;
end;
 
procedure TPorte.OuvrirPorte;
begin
  FCle.Ouvrir;
end;

Pour terminer, une fois le paramétrage des classes fini, nous pouvons créer une porte de maison et une porte de voiture.

TPorteMaison = class(TPorte)
public
  procedure Entrer;
  procedure Sortir;
end;
 
TPorteVoiture = class(TPorte)
public
  procedure Entrer;
  procedure Sortir;
end;
 
{ TPorteMaison }
 
procedure TPorteMaison.Entrer;
begin
 OuvrirPorte;
 Writeln('Enlever ses chaussures');
end;
 
procedure TPorteMaison.Sortir;
begin
 Writeln('Eteindre la lumière');
 FermerPorte;
end;
 
{ TPorteVoiture }
 
procedure TPorteVoiture.Entrer;
begin
  OuvrirPorte;
end;
 
procedure TPorteVoiture.Sortir;
begin
  FermerPorte;
end;

Nous avons deux portes qui on un comportement différent, de cette façon nous pouvons voir que la définition et l’implémentation sont indépendantes l’unes de l’autre.

En utilisant le patron de conception Pont, la composition (au lieu de l’héritage multiple) est privilégiée.

 

Laisser un commentaire

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

*