Stratégie (patron de conception) - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

En génie logiciel, le patron stratégie est un patron de conception (design pattern) de type comportemental grâce auquel des algorithmes peuvent être sélectionnés à la volée au cours du temps d'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 le moyen de définir une famille d'algorithmes, encapsuler chacun d'eux en tant qu'objet, et les rendre interchangeables. Ce patron 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.

Exemple en 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.

      using System;             ///  La manière dont le grand général guidera ses troupes      interface IStrategie {          void MettreEnOeuvre();      }             ///  Ce grand homme qui fera bientôt des choix décisifs       class SeigneurDeLaGuerre {                 ///  une stratégie générique           IStrategie _strategie;                 ///  comment changer de stratégie           public IStrategie Strategie { set { _strategie = value; } }                 ///  délégation de la tâche           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.");          }      }      ///  Différentes situations       enum Météo {          IlFaitBeau,          IlYADuBrouillard,          IlFaitTropChaudPourTravailler,          IlPleut      }             class Program {          static void Main() {                     // notre acteur              var kevin = new SeigneurDeLaGuerre();              var florian= 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;                      //florian.Strategie = new NeRienFaireCommedHabitude(); 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 Perigord.");              }                     // une exécution aux petits oignons              kevin.PrendreLaVille();          }      }      
Page générée en 0.095 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise