Le pattern Command
Description
Le pattern Command a pour objectif de transformer une requête en un objet, facilitant des opérations comme l’annulation, la mise en file des requêtes et leur suivi.
Exemple
Dans certains cas, la gestion d’une commande peut être assez complexe : elle peut être annulable, mise dans une file d’attente ou être tracée. Dans le cadre du système de vente de véhicules, le gestionnaire peut demander au catalogue de solder les véhicules d’occasion présents dans le stock depuis une certaine durée. Pour des raisons de facilité, cette demande doit pouvoir être annulée puis, éventuellement, rétablie.
Pour gérer cette annulation, une première solution consiste à indiquer au niveau de chaque véhicule s’il est ou non soldé. Cette solution n’est pas suffisante car un même véhicule peut être soldé plusieurs fois avec des taux différents. Une autre solution serait alors de conserver son prix avant la dernière remise, mais cette solution n’est pas non plus satisfaisante car l’annulation peut porter sur une autre requête de remise que la dernière.
Le pattern Command résout ce problème en transformant la requête en un objet dont les attributs vont contenir les paramètres ainsi que l’ensemble des objets sur lesquels la requête a été appliquée. Dans notre exemple, il devient ainsi possible d’annuler ou de rétablir une requête de remise.
La figure 4-3.1...
Structure
1. Diagramme de classes
La figure 4-3.3 détaille la structure générique du pattern.
Figure 4-3.3 - Structure du pattern Command
2. Participants
Les participants au pattern sont les suivants :
-
Commande est l’interface qui introduit la signature de la méthode lance qui exécute la commande.
-
CommandeConcrète (CommandeSolder) implante la méthode lance, gère l’association avec le ou les récepteurs et implante la méthode stocke- Annuler qui stocke l’état (ou les valeurs nécessaires) pour pouvoir annuler par la suite.
-
Client (Utilisateur) crée et initialise la commande et la transmet à l’appelant.
-
Appelant (Catalogue) stocke et lance la commande (méthode stockeLanceCommande) ainsi qu’éventuellement les requêtes d’annulation.
-
Récepteur (Véhicule) traite les actions nécessaires pour effectuer la commande ou pour l’annuler.
3. Collaborations
La figure 4-3.4 illustre les collaborations du pattern Command :
-
Le client crée une commande concrète en spécifiant le ou les récepteurs.
-
Le client transmet cette commande à la méthode stockeLanceCommande de l’appelant qui commence par stocker la commande.
-
L’appelant lance ensuite la commande en invoquant la méthode lance.
-
L’état ou les données nécessaires à l’annulation...
Domaines d’application
Le pattern est utilisé dans les cas suivants :
-
Un objet doit être paramétré par un traitement à réaliser. Dans le cas du pattern Command, c’est l’appelant qui est paramétré par une commande qui contient la description d’un traitement à réaliser sur un ou plusieurs récepteurs.
-
Les commandes doivent être stockées dans une file et pouvoir être exécutées à un moment quelconque, éventuellement plusieurs fois.
-
Les commandes sont annulables.
-
Les commandes doivent être tracées dans un fichier de log.
-
Les commandes doivent être regroupées sous la forme d’une transaction. Une transaction est un ensemble ordonné de commandes qui agissent sur l’état d’un système et qui peuvent être annulées.
Exemple en Java
Nous introduisons maintenant l’exemple en Java. La classe Vehicule s’écrit en Java comme suit. Chaque véhicule possède un nom, une date d’entrée dans le stock et un prix de vente. La méthode modifiePrix permet d’ajuster le prix avec un coefficient.
public class Vehicule
{
protected String nom;
protected long dateEntreeStock;
protected double prixVente;
public Vehicule(String nom, long dateEntreeStock,
double prixVente)
{
this.nom = nom;
this.dateEntreeStock = dateEntreeStock;
this.prixVente = prixVente;
}
public long getDureeStockage(long aujourdhui)
{
return aujourdhui - dateEntreeStock;
}
public void modifiePrix(double coefficient)
{
this.prixVente = 0.01 * Math.round(coefficient *
this.prixVente * 100);
}
public void affiche()
{
System.out.println(nom + " prix : " + prixVente +
" date entrée Stock " + dateEntreeStock);
}
}
La classe CommandeSolder possède les attributs suivants :
-
vehiculesSoldes : la liste des véhicules soldés.
-
dureeStock : la durée de stockage que doit dépasser un véhicule pour être soldé.
-
tauxRemise : le pourcentage de remise à appliquer sur les véhicules soldés.
et un pur attribut d’implantation :
-
aujourdhui : la valeur d’aujourd’hui.
La méthode solde calcule d’abord les véhicules à solder, puis ensuite modifie...