Stratégie (patron de conception)
# Stratégie (patron de conception)

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.

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++

Voir classe abstraite et fonction virtuelle pure.

## 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.

## Exemple en Delphi

Source : Delphi GOF Design Patterns (CodePlex)

## Exemple en Java

Nous savons que voler et cancaner sont les parties de la classe Canard qui varient d’un canard à l’autre.

Pour séparer ces comportements de la classe Canard, nous extrayons ces deux méthodes de la classe et nous créons un nouvel ensemble de classes pour représenter chaque comportement.

Canard utilise des attributs de type interface ComportementVol et ComportementCancan (le "bruit" du canard).

Ce sont ces interfaces qui encapsulent le code des méthodes effectuerVol et effectuerCancan.

Ce sont ces méthodes que nous souhaitons encapsuler, selon le patron de conception stratégie, afin de les rendre interchangeables.

Malgré notre volonté de rendre ces méthodes interchangeables :

* il reste d'autres méthodes que nous souhaitons conserver communes : ici la méthode nager.
* et d'autres méthodes que nous souhaitons spécifique à l'implémentation choisie : ici la méthode afficher.

Maintenant, nous allons spécialiser cette classe Canard en implémentant deux nouvelles classes héritant de Canard.

La classe Colvert :

Et la classe PrototypeCanard :

L'attribut comportementVol est un objet dont la classe implémente l'interface ComportementVol.

L'attribut comportementCancan est un objet dont la classe implémente l'interface ComportementCancan.

Il est alors possible de spécifier autant de ComportementVol et de ComportementCancan que nécessaire, simplement en créant de nouvelle classe implémentant ces deux interfaces.

À charge ensuite à ces classes d'implémenter les méthodes voler ...

... et cancaner pour spécifier le comportement désiré.

## Exemple en Smalltalk

Ici, le comportement d'une voiture peut être modifié en fonction de la stratégie de conduite:

On peut donc écrire:

