180 likes | 345 Views
Le patron de conception « Strategy ». Simon Durocher (2907206). Le principe général du patron. Le patron « Strategy » cherche principalement à séparer un objet de ses comportements/algorithmes en encapsulant ces derniers dans des classes à part.
E N D
Le patron de conception « Strategy » Simon Durocher (2907206)
Le principe général du patron • Le patron « Strategy » cherche principalement à séparer un objet de ses comportements/algorithmes en encapsulant ces derniers dans des classes à part. • Pour ce faire, on doit alors définir une famille de comportements ou d’algorithmes encapsulés et interchangeables.
Le problème général résolu par le patron • Le patron « Strategy » est utilisé lorsque: • Un problème possède plusieurs algorithme pour le résoudre. • Surtout si les algorithmes possèdent différents efficacités dans différentes situations. • Un objet peut avoir plusieurs comportements différents. • Aussi applicable lorsque différentes classes sont seulement différentes d’après leur comportement. • Des données que l’utilisateur ne devrait pas connaître se retrouve dans un algorithme.
Les avantages du patron • Si les algorithmes/comportements sont dans une classe a part, il est beaucoup plus facile de: • se retrouver dans le code principale • enlever, ajouter et modifier un algorithme/comportement • diminuer l’utilisation de tests conditionnels • éliminer la redondance et le couper/coller • accroître la réutilisabilité du code ainsi que sa flexibilité
L’implémentation du patron • Pour implémenter le patron « Strategy » ont doit: • 1. Définir une interface commune à tout les algorithmes ou comportements de même famille. • Ceci ce fait habituellement en créant une classe abstraite. • Ceci nous assure que tout les stratégies vont avoir les paramètres nécessaire à leur bon fonctionnement quitte à ce que certaines reçoivent des paramètres non nécessaires. • 2. Créer les classes comportant les algorithmes ou les comportements à partir de l’interface commune. • 3. Utilisé la stratégie voulu dans le code de l’objet.
Les participants • Dans l’image précédente, les participants sont: • Strategy: • L’interface commune de toute les stratégies. • Utilisé par Context pour appelé une stratégie concrète. • ConcreteStrategy: • Utilise l’interface Strategy pour implémenté un algorithme. • Context: • Maintient une référence à un objet Strategy. • Est configuré avec une ConcreteStrategy.
Exemple d’utilisation du patron • Calculer la vitesse verticale avec différentes stratégies. • Sans gravité ni friction. • Avec gravité seulement. • Avec friction seulement. • Avec gravité et friction. • Paramètres nécessaires: • Vitesse initiale. • Temps. • Gravité. • Friction.
Classe BalleStrategy (interface commune) • On commence par définir l’interface commune dans une classe abstraite. abstract class BalleStrategy { abstract public float vitesse(float v_in, float temps, float grav, float fric); }
Classe BalleStrategyRien (stratégie 1) • Ensuite on définit les stratégies dans des classes. class BalleStrategyRien extends BalleStrategy { public float vitesse(float v_in, float temps, float grav, float fric) { return v_in; } }
Classe BalleStrategyGrav (stratégie 2) class BalleStrategyGrav extends BalleStrategy { public float vitesse(float v_in, float temps, float grav, float fric) { return (v_in - grav*temps); } }
Classe BalleStrategyFric (stratégie 3) class BalleStrategyFric extends BalleStrategy { public float vitesse(float v_in, float temps, float grav, float fric) { return (v_in - temps*fric); } }
Classe BalleStrategyGravFric (stratégie 4) class BalleStrategyGravFric extends BalleStrategy { public float vitesse(float v_in, float temps, float grav, float fric) { return (v_in - (grav+fric)*temps); } }
Classe BalleContext • Ensuite on crée la classe de l’objet. class BalleContext { BalleStrategy strat; public BalleContext( BalleStrategy strategy ) { this.strat = strategy; } public float ContextInterface(float v_in, float temps, float grav, float fric) { return (strat.vitesse(v_in, temps, grav, fric)); } }
BalleProg • Finalement on utilise l’objet dans un programme. public class BalleProg { public static void main(String args[]) { float m=0; BalleContext bc = new BalleContext( new BalleStrategyRien() ); m = bc.ContextInterface(2, 3, 4, 5); System.out.println("Avec la stregie Rien, on obtient " + m); BalleContext bc2 = new BalleContext( new BalleStrategyGravFric() ); m = bc2.ContextInterface(2, 3, 4, 5); System.out.println("Avec la stregie GravFric, on obtient " + m); } }
Références • http://www.exciton.cs.rice.edu/JavaResources/DesignPatterns/StrategyPattern.htm • http://www.scriptsphp.net/article.Le-design-pattern-Strategy • http://www.dofactory.com/Patterns/PatternStrategy.aspx • http://www.patterndepot.com/put/8/JavaPatterns.htm