Encore une fois, il s'agit d'un ancien article, mais il revient toujours dans les recherches. Je vais donc ajouter deux autres exemples (le code est en C#). J'aime absolument le modèle Strategy car il m'a sauvé la mise de nombreuses fois lorsque les chefs de projet m'ont dit : "Nous voulons que l'application fasse 'X', mais 'X' n'est pas encore clair et il peut changer dans un avenir proche". Ce site vidéo expliquant le modèle de stratégie utilise StarCraft comme exemple.
Les choses qui entrent dans cette catégorie :
-
Triage : Nous voulons trier ces chiffres, mais nous ne savons pas si nous allons utiliser BrickSort, BubbleSort ou un autre type de tri.
-
Validation : Nous devons vérifier les éléments selon "une certaine règle", mais la nature de cette règle n'est pas encore claire, et nous pouvons en imaginer de nouvelles.
-
Jeux : Nous voulons que le joueur puisse marcher ou courir lorsqu'il se déplace, mais peut-être qu'à l'avenir, il devrait aussi être capable de nager, voler, se téléporter, s'enfouir sous terre, etc.
-
Stockage des informations : Nous voulons que l'application stocke des informations dans la base de données, mais plus tard, elle devra peut-être être capable de sauvegarder un fichier ou d'effectuer un appel Web.
-
Sortie : Nous avons besoin de sortir X sous la forme d'une simple chaîne de caractères, mais plus tard cela peut être un CSV, XML, JSON, etc.
Exemples
J'ai un projet dans lequel les utilisateurs peuvent attribuer des produits à des personnes dans une base de données. Cette affectation d'un produit à une personne a un statut qui est soit "Approuvé" soit "Refusé", qui dépend de certaines règles de gestion. Par exemple : si un utilisateur attribue un produit à une personne d'un certain âge, son statut doit être refusé ; si la différence entre deux champs de l'article est supérieure à 50, son statut est refusé, etc.
Or, au moment du développement, ces règles commerciales ne sont pas encore toutes parfaitement claires, et de nouvelles règles peuvent apparaître à tout moment. La puissance du modèle de stragety est que j'ai créé un RuleAgent, qui reçoit une liste de IRules.
public interface IRule {
bool IsApproved(Assignment assignment);
}
Au moment d'attribuer un produit à une personne, je crée un RuleAgent, je lui donne une liste de règles (qui implémentent toutes IRule), et je lui demande de valider une attribution. Il va passer en revue toutes ses règles. Celles-ci, parce qu'elles implémentent toutes la même interface, ont toutes l'attribut IsApproved
et renvoie false si l'un d'entre eux renvoie false.
Maintenant, lorsque par exemple le manager arrive soudainement et dit, nous devons également refuser toutes les affectations aux stagiaires, ou toutes les affectations aux personnes qui font des heures supplémentaires.... Vous créez de nouvelles classes comme ça :
public OvertimeRule : IRule
{
public bool IsApproved(Assignment assignment) //Interface method
{
if (assignment.Person.Timesheet >= 40)
{
return false;
}
return true;
}
}
public InternRule : IRule
{
public bool IsApproved(Assignment assignment) //Interface method
{
if (assignment.Person.Title == "Intern")
{
return false;
}
return true;
}
}
Vous voyez qu'il n'est pas nécessaire de continuer à ajouter ou à supprimer des déclarations if ou du code, il suffit de créer une nouvelle classe de règles qui implémente l'interface IRUle et d'intervertir les règles lorsque cela est nécessaire.
Un autre excellent exemple : La série de vidéos de Scott Allen sur http://www.asp.net/mvc/pluralsight où il utilise le modèle de stratégie dans la partie Unit-test de l'application.
Il construit un site Web dont une page affiche des articles en fonction de leur popularité. Cependant, "populaire" peut être beaucoup de choses (le plus de vues, le plus d'abonnés, la date de création, le plus d'activité, le moins de commentaires, etc), et dans le cas où la direction ne sait pas encore exactement comment ordonner, et peut vouloir expérimenter avec différents ordonnancements à une date ultérieure. Vous créez une interface (IOrderAlgorithm ou autre) avec une méthode de commande, et laissez un objet Orderer déléguer la commande à une implémentation concrète de l'interface IOrderAlgorithm. Vous pouvez créer un "CommentOrderer", un "ActivityOrderer", etc... Et il suffit de les changer quand de nouvelles exigences apparaissent.