Strategy
(Stratégie)

But : Définir une famille d'algorithmes, encapsuler chacun d'entre eux et les rendre interchangeables par le biais d'une interface.

Exemple

// 1 - interface de l'algo
interface Strategy {
    void solve();
}

// 2 - implémentations de l'algo
class Solution1 implements Strategy {
    void solve(){ ... }
}

class Solution2 implements Strategy {
    void solve(){ ... }
}

// 3 - Client
public class Client {
    public static void main( String[] args ) {
        Strategy[] strategies = {new Solution1(), new Solution2()};
        for (Strategy strategy : strategies) {
            strategy.solve();
        }
    }
}
(voir le code dans StrategyDemo.java).

Dans StrategyDemo1.java, le choix des stratégies implémentées est statique (connu à la compilation).
Dans StrategyDemo2.java, ce choix est dynamique.

Voir sur wikipedia un autre exemple illustrant la modification dynamique de la stratégie :
Car suvCar = new SUV();  // Constructor sets strategy "BrakeWithABS"
suvCar.applyBrake();     // This will invoke class "BrakeWithABS"

suvCar.setBrakeBehavior( new Brake() ); // set brake behavior dynamically
suvCar.applyBrake();    // This will invoke class "Brake"
(copie locale dans CarExample.java)

Structure

Le diagramme classique (gof) : Strategy GOF Context sert d'intermédiaire entre le code client et les statégies. Pas toujours utile, transmet les requêtes des clients à la stratégie utilisée.
Le code client choisit la stratégie à utiliser et la transmet au contexte.
Exercice : Utilisation de Strategy pour calculer pi, qui permet d'illustrer l'utilisation de Context.

Remarques