Commande

Commande (Command) est un patron de conception de type comportemental (càd il définit comment organiser les objets) qui encapsule la notion d’invocation. Il permet de séparer complètement la définition de l’implémentation.

Quand l’utiliser ?

Ce patron de conception est à utiliser quand il y a grand nombre de méthodes similaires. En Delphi il peut correspondre au comportement du TActionList.

Exemple

Pour illustrer le patron Commande, prenons l’exemple d’une personne qui se présente.

Premièrement commençons par ajouter une interface ICommande qui définie une méthode appelée Execute.

ICommande = interface
['{3CB84B5B-261A-4EFF-9117-9A019A1682C9}']
  procedure Execute;
end;

Ensuite ajoutons des personnes ayant nationalités différentes.

TFrancais = class(TInterfacedObject, ICommande)
  procedure Execute;
end;
 
TAllemand = class(TInterfacedObject, ICommande)
  procedure Execute;
end;
 
TAnglais = class(TInterfacedObject, ICommande)
  procedure Execute;
end;

La méthode Execute affiche un message en fonction de la langue parlée par la personne.

{ TFrancais }
 
procedure TFrancais.Execute;
begin
  ShowMessage('Bonjour');
end;
 
{ TAllemand }
 
procedure TAllemand.Execute;
begin
  ShowMessage('Guten Tag');
end;
 
{ TAnglais }
 
procedure TAnglais.Execute;
begin
  ShowMessage('Hello');
end;

Pour finir ajoutons un traducteur qui va stocker une liste de commande.

TTraducteur = class
strict private
  FList: TInterfaceList;
public
  constructor Create;
  procedure AddCommande(aCommande: ICommande);
  procedure DireBonjour;
end;
 
{ TTraducteur }
 
constructor TTraducteur.Create;
begin
  inherited Create;
  FList := TInterfaceList.Create;
end;
 
procedure TTraducteur.AddCommande(aCommande: ICommande);
begin
  if aCommande = nil then
    raise Exception.Create('La commande doit être définie');
 
  FList.Add(aCommande)
end;

La méthode DireBonjour utilise le patron de conception Commande.

Le traducteur connait uniquement la définition (la présence d’une méthode Execute) en revanche il ne sais pas ce qu’elle peut faire. Le trans-typage avec le mot clé as est possible grâce à la présence du GUID.

procedure TTraducteur.DireBonjour;
var
  Commande: IInterface;
begin
  for Commande in FList do
  begin
    (Commande as ICommande).Execute;
  end;
end;

Pour terminer il suffit de créer le traducteur.

procedure TesterCommande;
var
  Traducteur: TTraducteur;
begin
  Traducteur := TTraducteur.Create;

  try
    Traducteur.AddCommande(TFrancais.Create);
    Traducteur.AddCommande(TAllemand.Create);
    Traducteur.AddCommande(TAnglais.Create);

    Traducteur.DireBonjour;
  finally
    Traducteur.Free;
  end;
end;

Laisser un commentaire

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

*