Patrons de conception/Stratégie
Le patron "stratégie" est un patron de conception de type comportemental grâce auquel des algorithmes peuvent être sélectionnés à la volée au cours de l'exécution selon certaines conditions, comme les stratégies utilisées en temps de guerre.
Le patron de conception stratégie est utile pour des situations où il est nécessaire de permuter dynamiquement les algorithmes utilisés dans une application.
Le patron stratégie est prévu pour fournir des moyens de définir une famille d'algorithmes, encapsuler chacun comme objet, et les rendre interchangeables.
Le patron stratégie laisse les algorithmes changer indépendamment des clients qui les emploient.
Utilisation.
Dès lors qu'un objet peut effectuer plusieurs traitements différents, dépendant d'une variable ou d'un état.
Exemples.
C++.
using namespace std;
class IStrategie
public:
 virtual void execute() = 0;
class AlgorithmeA: public IStrategie
public:
 void execute()
 cout « "Traitement A" « endl;
};
class AlgorithmeB: public IStrategie
public:
 void execute()
 cout « "Traitement B" « endl;
};
class AlgorithmeC: public IStrategie
public:
 void execute()
 cout « "Traitement C" « endl;
};
class Element
private:
 IStrategie* strategie;
public:
 Element(IStrategie* strategie) : strategie(strategie)
 void execute()
 this->strategie->execute();
};
int main(int argc, char *argv[])
 AlgorithmeA algoA;
 AlgorithmeB algoB;
 AlgorithmeC algoC;
 Element elementA(&algoA);
 Element elementB(&algoB);
 Element elementC(&algoC);
 elementA.execute(); // L'élément A va effectuer le traitement A
 elementB.execute(); // L'élément B va effectuer le traitement B
 elementC.execute(); // L'élément C va effectuer le traitement C
 return (0);
C#.
Des idées semblables amènent à une réalisation à l'aide d'interface.
L'objet qui doit avoir une stratégie adaptable à l'exécution implémente IStrategie : la même interface que d'autres objets.
L'objet principal délègue l'exécution de la tâche à un autre objet membre qui implémente IStrategie.
L'objet membre étant déclaré dans la classe comme une interface, son implémentation importe peu, on peut donc changer de stratégie à l'exécution.
Cette manière de faire se rapproche du Principe de l'injection de dépendance (inversion de contrôle).
using System;
/// <summary> La manière dont le grand général guidera ses troupes </summary>
interface IStrategie
 void MettreEnOeuvre();
/// <summary> Ce grand homme qui fera bientôt des choix décisifs </summary>
class SeigneurDeLaGuerre
 /// <summary> une stratégie générique </summary>
 IStrategie _strategie;
 /// <summary> comment changer de stratégie </summary>
 public IStrategie Strategie
 /// <summary> délégation de la tâche </summary>
 public void PrendreLaVille()
 _strategie.MettreEnOeuvre();
class DéfoncerLePontLevisDeFace : IStrategie
 public void MettreEnOeuvre()
 Console.WriteLine("Prendre la ville de face en défonçant le pont levis.");
class PasserParLaFaceNord : IStrategie
 public void MettreEnOeuvre()
 Console.WriteLine("Prendre la ville en escaladant la muraille nord.");
class AttendreQueLaVilleSeRende : IStrategie
 public void MettreEnOeuvre()
 Console.WriteLine("Attendre qu'il n'y ait plus rien à manger en ville "
 + "et que tout le monde meure de faim.");
class SeMarierAvecLaCousineDuDuc : IStrategie
 public void MettreEnOeuvre()
 Console.WriteLine("Organiser un mariage avec la cousine du Duc "
 + "alors qu'elle rejoint la ville de retour des baléares "
 + "et inviter toute la ville à une grande fête.");
/// <summary> Différentes situations </summary>
enum Météo
 IlFaitBeau,
 IlYADuBrouillard,
 IlFaitTropChaudPourTravailler,
 IlPleut
class Program
 static void Main()
 // notre acteur
 var kevin = new SeigneurDeLaGuerre();
 // les aléas du système
 var météo = (Météo)(new Random().Next(0, 3));
 // une liaison tardive
 switch (météo)
 case Météo.IlFaitBeau:
 kevin.Strategie = new DéfoncerLePontLevisDeFace(); break;
 case Météo.IlYADuBrouillard:
 kevin.Strategie = new PasserParLaFaceNord(); break;
 case Météo.IlFaitTropChaudPourTravailler:
 kevin.Strategie = new AttendreQueLaVilleSeRende(); break;
 case Météo.IlPleut:
 kevin.Strategie = new SeMarierAvecLaCousineDuDuc(); break;
 default:
 throw new Exception("Nan finalement seigneur de la guerre c'est "
 + "pas cool comme job : vous décidez d'aller élever "
 + "des chèvres dans le Larzac.");
 // une exécution aux petits oignons
 kevin.PrendreLaVille();