Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en Java
  3. Le pattern Template Method
Extrait - Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception
Extraits du livre
Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception Revenir à la page d'achat du livre

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.

images/fig274.PNG

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; 
  } ...