Rechercher : dans
Par :

JAVA - utilisation des strategy patterns

Dernière réponse le 24 nov 2008 à 11:35:33 Jules75, le 24 nov 2008 à 09:08:02 
 Signaler ce message aux modérateurs

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

Configuration: Windows 2000
Internet Explorer 6.0

Meilleures réponses pour « JAVA utilisation des strategy patterns » dans :
Hibernate [Partie 2]: configuration et utilisation VoirVoir la première partie de l'astuce Hibernate (Partie 1): Présentation Configuration Hibernate dans une application JAVA Utilisation de Hibernate dans une application JAVA : configuration et utilisation de Hibernate Configuration...
[Firefox] plugin Java Jre de Sun VoirA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes...
[Programmation] Comment débuter, quel langage? VoirComment débuter, quel langage? Introduction Ceux que l'on peut utiliser Delphi/Pascal Java Python .Net Smalltalk Ceux que l'on peut utiliser à la rigueur C/C++ PHP Ada Lisp/Caml/... Ceux que l'on peut ne pas utiliser
Java - Les packages VoirIntroduction aux packages La programmation Java consiste à créer des classes. Or, étant donné qu'un programme est généralement développé par une équipe de programmeurs, c'est-à-dire plusieurs personnes, le fait de concaténer (mettre bout à bout)...
Java - L'héritage VoirLa notion d'héritage Le concept d'héritage est un des concepts les plus importants de la programmation orientée objet, car il conditionne irréversiblement la façon selon laquelle un code Java est écrit. L'héritage est un mécanisme permettant de...

1

kilian, le 24 nov 2008 à 11:04:05
  • +2

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()
       }
}


Le gâteau est un mensonge!

Répondre à kilian

2

Jules75, le 24 nov 2008 à 11:34:05

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

Bonne journée
Jules

Répondre à Jules75

3

Jules75, le 24 nov 2008 à 11:35:03

Ooops, par contre je n'arrive pas à mettre le sujet comme résolu ...

Répondre à Jules75

4

 kilian, le 24 nov 2008 à 11:35:33

C'est fait, merci :-) Le gâteau est un mensonge!

Répondre à kilian
Collection CommentÇaMarche.net