strategie

VI-I. Stratégie (Strategy ou Policy)

OBJECTIFS :

  • Définir une famille d'algorithmes interchangeables.
  • Permettre de les changer indépendamment de la partie cliente.
RAISONS DE L'UTILISER :

Un objet doit pouvoir faire varier une partie de son algorithme.

Cela peut être une liste triée. A chaque insertion, la liste place le nouvel élément à l'emplacement correspondant au tri. Le tri peut être alphabétique, inverse, les majuscules avant les miniscules, les minuscules avant, etc...

La partie de l'algorithme qui varie (le tri) est la stratégie. Toutes les stratégies présentent la même interface. La classe utilisant la stratégie (la liste) délègue la partie de traitement concernée à la stratégie.

RESULTAT :

Le Design Pattern permet d'isoler les algorithmes appartenant à une même famille d'algorithmes.

RESPONSABILITES :

  • Strategie : définit l'interface commune des algorithmes.
  • ConcreteStrategieA et ConcreteStrategieB : implémentent les méthodes d'algorithme.
  • ClasseUtilisantStrategie : utilise un objet Strategie.
  • La partie cliente configure un objet ClasseUtilisantStrategie avec un objet Strategie et appelle la méthode de ClasseUtilisantStrategie qui utilise la stratégie. Dans l'exemple, la configuration s'effectue par le constructeur, mais la configuration peut également s'effectuer par une méthode "setter".
IMPLEMENTATION JAVA :
Strategie.java
/**
* Définit l'interface d'une stratégie.
*/
public interface Strategie {

public void operationStrategie();
}
ConcreteStrategieA.java
/**
* Définit une stratégie
*/
public class ConcreteStrategieA implements Strategie {

public void operationStrategie() {
System.out.println("Operation de la strategie A");
}
}
ConcreteStrategieB.java
/**
* Définit une stratégie
*/
public class ConcreteStrategieB implements Strategie {

public void operationStrategie() {
System.out.println("Operation de la strategie B");
}
}
ClasseUtilisantStrategie.java
/**
* Utilise une stratégie.
* La classe fait appel à la même méthode de l'objet "Strategie".
* C'est l'objet "Strategie" qui change.
*/
public class ClasseUtilisantStrategie {

private Strategie strategie;

/**
* Constructeur recevant un objet "Strategie" en paramètre
* @param pStrategie
*/
public ClasseUtilisantStrategie(Strategie pStrategie) {
strategie = pStrategie;
}

/**
* Délègue le traitement à la stratégie
*/
public void operation() {
strategie.operationStrategie();
}
}
StrategyPatternMain.java
public class StrategyPatternMain {

public static void main(String[] args) {
// Création d'instance des classes "Strategie"
Strategie lStrategieA = new ConcreteStrategieA();
Strategie lStrategieB = new ConcreteStrategieB();


// Création d'instance de la classe qui utilise des "Strategie"
ClasseUtilisantStrategie lClasseA = new ClasseUtilisantStrategie(lStrategieA);
ClasseUtilisantStrategie lClasseB = new ClasseUtilisantStrategie(lStrategieB);

// Appel de la méthode de la classe
// utilisant une stratégie
lClasseA.operation();
lClasseB.operation();

// Affichage :
// Operation de la strategie A
// Operation de la strategie B
}
}
Comments