Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à 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 Strategy
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 Strategy

Description

Le pattern Strategy a pour objectif d’adapter le comportement et les algorithmes d’un objet en fonction d’un besoin sans changer les interactions de cet objet avec les clients.

Ce besoin peut relever de plusieurs aspects comme des aspects de présentation, d’efficacité en temps ou en mémoire, de choix d’algorithmes, de représentation interne, etc. Mais évidemment, il ne s’agit pas d’un besoin fonctionnel vis-à-vis des clients de l’objet car les interactions entre l’objet et ses clients doivent rester inchangées.

Exemple

Dans le système de vente en ligne de véhicules, la classe VueCatalogue dessine la liste des véhicules destinés à la vente. Un algorithme de dessin est utilisé pour calculer la mise en page en fonction du navigateur. Il existe deux versions de cet algorithme :

  • Une première version qui n’affiche qu’un seul véhicule par ligne (un véhicule prend toute la largeur disponible) et qui affiche le maximum d’informations ainsi que quatre photos.

  • Une seconde version qui affiche trois véhicules par ligne mais qui affiche moins d’informations et une seule photo.

L’interface de la classe VueCatalogue ne dépend pas du choix de l’algorithme de mise en page. Ce choix n’a pas d’impact sur la relation d’une vue de catalogue avec ses clients. Il n’y a que la présentation qui est modifiée.

Une première solution consiste à transformer la classe VueCatalogue en une interface ou en une classe abstraite et à introduire deux sous-classes d’implantation différant par le choix de l’algorithme. Ceci présente l’inconvénient de complexifier inutilement la hiérarchie des vues de catalogue.

Une autre possibilité est d’implanter les deux algorithmes dans la classe VueCatalogue et à l’aide d’instructions conditionnelles d’effectuer les choix. Mais...

Structure

1. Diagramme de classes

La figure 4-10.2 montre la structure générique du pattern.

images/figure26-2.png

Figure 4-10.2 - Structure du pattern Strategy

2. Participants

Les participants au pattern sont les suivants :

  • Stratégie (DessinCatalogue) est l’interface commune à tous les algorithmes. Cette interface est utilisée par Entité pour invoquer l’algorithme.

  • StratégieConcrèteA et StratégieConcrèteB (DessinUnVéhiculeLigne et DessinTroisVéhiculesLigne) sont les sous-classes concrètes qui implantent les différents algorithmes.

  • Entité est la classe utilisant un des algorithmes des classes d’implantation de Stratégie. En conséquence, elle possède une référence vers une instance de l’une de ces classes. Enfin, si nécessaire, elle peut exposer ses données internes aux classes d’implantation.

3. Collaborations

L’entité et les instances des classes d’implantation de Stratégie interagissent pour implanter les algorithmes. Dans le cas le plus simple, les données nécessaires à l’algorithme sont transmises en paramètre. Si nécessaire, la classe Entité implante des méthodes pour donner accès à ses données internes.

Le client initialise l’entité avec une instance de la classe d’implantation...

Domaines d’application

Le pattern est utilisé dans les cas suivants :

  • Le comportement d’une classe peut être implanté par différents algorithmes dont certains sont plus efficaces en temps d’exécution ou en consommation mémoire ou encore contiennent des mécanismes de mise au point.

  • L’implantation du choix de l’algorithme par des instructions conditionnelles est trop complexe.

  • Un système possède de nombreuses classes identiques à l’exception d’une partie de leur comportement.

Dans le dernier cas, le pattern Strategy permet de regrouper ces classes en une seule, ce qui simplifie l’interface pour les clients.

Exemple en Java

Notre exemple en Java est basé sur l’affichage du catalogue de véhicules, simulé ici simplement avec des sorties à l’écran.

L’interface DessinCatalogue introduit la méthode dessine qui prend en paramètre une liste d’instances de VueVehicule.

import java.util.*; 
public interface DessinCatalogue 
{ 
  void dessine(List<VueVehicule> contenu); 
} 

La classe DessinUnVehiculeLigne implante la méthode dessine en affichant chaque véhicule sur une ligne (impression d’un saut de ligne après l’affichage d’un véhicule).

import java.util.*; 
public class DessinUnVehiculeLigne implements 
  DessinCatalogue 
{ 
 
  public void dessine(List<VueVehicule> contenu) 
  { 
    System.out.println( 
      "Dessine les véhicules avec un véhicule par ligne"); 
    for (VueVehicule vueVehicule: contenu) 
    { 
      vueVehicule.dessine(); 
      System.out.println(); 
    } 
    System.out.println(); 
  } 
} 

La classe DessinTroisVehiculesLigne implante...