Le patron de conception « Strategy »

publicité
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.
2
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.
3
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é
4
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.
5
Représentation du patron
6
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.
7
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.
8
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);
}
9
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;
}
}
10
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);
}
}
11
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);
}
}
12
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);
}
}
13
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));
}
}
14
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);
}
}
15
Références
http://www.exciton.cs.rice.edu/JavaResources/DesignPat
terns/StrategyPattern.htm
http://www.scriptsphp.net/article.Le-design-patternStrategy
http://www.dofactory.com/Patterns/PatternStrategy.aspx
http://www.patterndepot.com/put/8/JavaPatterns.htm
16
Questions
17
Téléchargement