JAVA - utilisation des strategy patterns

Résolu/Fermé
Jules75 - 24 nov. 2008 à 09:08
 mouenza - 6 déc. 2010 à 17:36
Bonjour tout le monde,

Voici mon problème, j'ai une array d'objets (disons de noms de fruits et légumes, non nécessairement différents) :

String[] myArray = new String[]{"pomme", "pomme", "patate" .... };

Et j'aimerais faire un traitement sur cette liste, ce qui rentre en jeu à chaque fois c'est le nombre de fruits et de légumes dans la liste, leur nature, leur couleur ... Je m'explique, la façon "crade" de coder mon traitement serait de faire

if (nombreDePommes = myArray.length){
doSomething1();
}else if (mesFruitsSontTousRouges()){
doSomething2();
}else if (monPanierContientDesCourges()){
doSomething3();
}

...

Et ainsi de suite...
Je me suis un peu documenté sur internet, et la façon propre de coder ça serait d'utiliser un strategy pattern, (et ainsi définir StrategyNbPommes ... ), mais ça ne résout pas tous mes problèmes, pour faire appel à la bonne stratégie à chaque fois, je suis obligé de faire une boucle if else ..., je ne vois pas en plus comment je pourrais utiliser une factory dans ce cas là, parce que les clefs de ma factory ne sont pas clairement définies.

Est ce que quelqu'un pour me guider sur ce problème SVP?

Merci beaucoup
Jules
A voir également:

2 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
24 nov. 2008 à 11:04
Hmm. On peut reprendre l'idée des stragegy patterns, sauf que chacune de ces stratégies se charge de vérifier sa propre condition.
Tu peux prendre une méthode statique pour instancier ces strategies. Si la condition est bonne: on instancie la stratégie, sinon on retourne une fausse strategie.

Du coup, le truc ressemble plus à une chaine de responsabilité.

class MonBidule {

    String[] myArray = new String[]{"pomme", "pomme", "patate" .... }; 
  
    public void monTruc()
    {
          Strategy s1 = Strategy1.getInstance(this);
          Strategy s2 = Strategy2.getInstance(this);
          ..........

          Strategy s[] = {s1,s2,....};

          for (int i = 0; i < s.length; i++) {
              s[i].execute();
          }
     }

     .......
}

abstract class Strategy {
         protected MonBidule b;
         abstract public void execute();
}

class StrategyStub {
        public void execute(){}
        private StrategyStub(MonBidule b) { this.b = b; }
}

class Strategy1 {
       public static Strategy getInstance(MonBidule b)
       {
               if (b.queDesPommes())
                   return new Strategy1(b);
               else
                   return new StrategyStub(b);
       }
       private StrategyStub(MonBidule b)
       {
              //.....
       }
       public void execute()
       {
              .....//doSomething1()
       }
}

class Strategy2 {
       public static Strategy getInstance(MonBidule b)
       {
               if (b.mesFruitsSontTousRouges())
                   return new Strategy2(b);
               else
                   return new StrategyStub(b);
       }
       private StrategyStub(MonBidule b)
       {
              //.....
       }
       public void execute()
       {
              .....//doSomething2()
       }
}


3
Merci beaucoup Kilian, c'est exactement ce qu'il me fallait, très claire comme explication. Merci encore

Bonne journée
Jules
0
Jules75 > Jules75
24 nov. 2008 à 11:35
Ooops, par contre je n'arrive pas à mettre le sujet comme résolu ...
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > Jules75
24 nov. 2008 à 11:35
C'est fait, merci :-)
0
Salut,
moi aussi j'ai un problème avec le pattern strategy, je dois réaliser une application de gestion bancaire et je dois implémenter un robot qui me permettra par exemple de fixer un budget mensuel pour l'alimentation ou encore les loisirs.
Je ne vois pas comment commencer, si quelqu'un pouvait me donner une piste sa serais bien.
Merci
0