Le pattern Template Method
Description
Le pattern Template Method permet de reporter dans des sous-classes certaines étapes de l’une des opérations d’un objet, ces étapes étant alors décrites dans les sous-classes.
Exemple
Au sein du système de vente en ligne de véhicules, nous gérons des commandes issues de clients en France et au Luxembourg. La différence entre ces deux commandes concerne notamment le calcul de la TVA. Si en France, le taux de TVA est de 20 %, il est de 17 % au Luxembourg. Le calcul de la TVA demande deux opérations de calcul distinctes en fonction du pays.
Une première solution consiste à implanter deux classes distinctes sans surclasse commune : CommandeFrance et CommandeLuxembourg. Cette solution présente l’inconvénient majeur d’avoir du code identique mais qui n’a pas été factorisé comme l’affichage des informations de la commande (méthode affiche).
Une classe abstraite Commande peut être introduite pour factoriser les méthodes communes comme la méthode affiche.
Le pattern Template Method propose d’aller plus loin en proposant de factoriser du code commun au sein des méthodes. Nous prenons l’exemple de la méthode calculeMontantTtc dont l’algorithme est le suivant pour la France (en pseudo-code).
calculeMontantTtc :
montantTva = montantHt * 0,2 ;
montantTtc = montantHt + montantTva ;
L’algorithme pour le Luxembourg est donné par le pseudo-code suivant.
calculeMontantTtc :
montantTva = montantHt * 0,17) ;
montantTtc = montantHt...
Structure
1. Diagramme de classes
La figure 4-11.4 montre la structure générique du pattern.
Figure 4-11.4 - Structure du pattern Template Method
2. Participants
Les participants au pattern sont les suivants :
-
La classe abstraite ClasseAbstraite (Commande) introduit la méthode "modèle" ainsi que la signature des méthodes abstraites que cette méthode invoque.
-
La sous-classe concrète ClasseConcrète (CommandeFrance et CommandeLuxembourg) implante les méthodes abstraites utilisées par la méthode "modèle" de la classe abstraite. Il peut y avoir plusieurs classes concrètes.
3. Collaborations
L’implantation de l’algorithme est réalisée par la collaboration entre la méthode "modèle" de la classe abstraite et les méthodes d’une sous-classe concrète qui complètent l’algorithme.
Domaines d’application
Le pattern est utilisé dans les cas suivants :
-
Une classe partage avec une autre ou plusieurs autres classes du code identique qui peut être factorisé après que le ou les parties spécifiques à chaque classe aient été déplacées dans de nouvelles méthodes.
-
Un algorithme possède une partie invariable et des parties spécifiques à différents types d’objets.
Exemple en Java
La classe abstraite Commande introduit la méthode "modèle" calculeMontantTtc qui invoque la méthode abstraite calculeTva.
public abstract class Commande
{
protected double montantHt;
protected double montantTva;
protected double montantTtc;
protected abstract void calculeTva();
public void calculeMontantTtc()
{
this.calculeTva();
montantTtc = montantHt + montantTva;
}
public void setMontantHt(double montantHt)
{
this.montantHt = montantHt;
}
public void affiche()
{
System.out.println("Commande");
System.out.println("Montant HT " + montantHt);
System.out.println("Montant TTC " + montantTtc);
}
}
La sous-classe concrète CommandeFrance implante la méthode calculeTva avec le taux de TVA français.
public class CommandeFrance extends Commande
{
protected void calculeTva()
{
montantTva = montantHt * 0.2;
} ...