Visiteur

Le patron de conception Visiteur (Visitor) permet d’externaliser et de centraliser des actions à effectuer sur des objets qui n’ont pas de liens. Cela permet de séparer un algorithme de la structure des données.

Utilisation

Ce patron Visiteur est à utiliser de manière prudente car l’ajout ou la modification d’une classe ne va pas modifier le visiteur de la classe. Il permet de mettre en place des traitements adaptés aux méthodes public des objets.

Exemple

Tout d’abord pour illustrer ce patron de conception, commençons par déclarer une interface et créer trois classes. Nous allons ajouter une méthode Accept avec en paramètre un visiteur. Les constructeurs assigne les valeurs dans la variable privée de la classe.

type
  IVisitor = interface;
 
  TCountry = class
  strict private
    FName: string;
  public
    constructor Create(aName: string);
    procedure Accept(aVisitor: IVisitor);
    property Name: string read FName;
  end;
 
  TVehicle = class
  strict private
    FCategory: string;
  public
    constructor Create(aCategory: string);
    procedure Accept(aVisitor: IVisitor);
    property Category: string read FCategory;
  end;
 
  TBook = class
  strict private
    FTitle: string;
  public
    constructor Create(aTitle: string);
    procedure Accept(aVisitor: IVisitor);
    property Title: string read FTitle;
  end;

Ensuite nous pouvons terminer la déclaration de l’interface et de classe TVisitor.

IVisitor = interface
  procedure Visit(aObject: TCountry); overload;
  procedure Visit(aObject: TVehicle); overload;
  procedure Visit(aObject: TBook); overload;
end;
 
TVisitor = class(TInterfacedObject, IVisitor)
  procedure Visit(aObject: TCountry); overload;
  procedure Visit(aObject: TVehicle); overload;
  procedure Visit(aObject: TBook); overload;
end;

Pour finir, et tester cette exemple. Un livre est créé et « accepte » le visiteur.

procedure TestVisitor;
var
  Visitor: IVisitor;
  Book: TBook;
begin
  Visitor := TVisitor.Create;
  Book := TBook.Create('Le Petit Prince');
  try
    Book.Accept(Visitor);
  finally
    Book.Free;
  end;
end;

L’utilisation du double-dispatch dans ce patron de conception permet d’utiliser le type dynamique. C’est pourquoi la méthode Visit n’est pas appelée directement depuis le Visitor.

Laisser un commentaire

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

*