Le diagramme de classe ci-dessous illustre la structure de notre application.
Voici quelques points clés à retenir :
Strategyable est une interface qui définit une méthode TestCombination pour tester une combinaison. Nous avons préféré utiliser une interface plutôt qu'une classe abstraite pour permettre une plus grande flexibilité dans la définition des stratégies. De plus elle ne contient pas d'attributs.
FactoryStrategy est une classe qui permet de créer des stratégies. Elle contient des méthodes pour créer différentes stratégies (par exemple MakeMax, MakeMin, MakeEven, MakeNb, etc.). Cette classe permet de centraliser la création des stratégies et de faciliter l'ajout de nouvelles stratégies. Cela limite aussi beaucoup les dépendances entre les classes.
Player est une classe qui représente un joueur. Elle contient un nom et un récapitulatif des combinaisons proposées par le joueur, ainsi que les résultats obtenus pour chaque combinaison.
Recap est une classe qui représente le récapitulatif des combinaisons proposées par un joueur. Elle contient un tableau de combinaisons, un tableau de résultats et un tableau de notes pour chaque combinaison.
Modifications continue de la conception
Nous avons décidé de supprimer les classe Round et TestSolution car pour l'une nous pouvons récupérer les valeurs dans le controller. Et pour la seconde nous nous en sommes dispensé en utilisant une méthode de la classe Game pour tester les combinaisons.
Nous avons aussi ajouté des méthodes: Dans la classe Game:
generateAllCombinations pour générer toutes les combinaisons possibles. (125 combinaisons)
filterCombinations pour filtrer les combinaisons en fonction des stratégies choisies par les joueurs.
fillRemainStrategies pour remplir les stratégies restantes avec des stratégies aléatoires.
isUniqueCombination pour vérifier si une combinaison est unique.
Dans la classe FactoryStrategy nous avons ajoutés toutes les stratégies que nous voulions implémenter.
Pour la gestion des stratégies, nous avons supprimé la classe abstraite Strategy et nous avons transformé l'inteface Strategyable en classe abstraite pour pouvoir ajouter des méthodes. Ces classes sont implémentées dans la classe FactoryStrategy en redéfinissant la méthode abstraite TestCombination.