Le code contenu dans
enonce/
simule le fonctionnement d'une ruche peuplée d'abeilles.
Une ruche est composée de rayons, eux mêmes composés de cellules.
Il existe 3 types de cellule, dépendant de leur usage :
CelluleOuvriere
, CelluleRoyale
et CelluleMale
.
Le pattern Composite est utilisé pour modéliser cette hiérarchie.
L'implémentation de ce composite est fournie dans
enonce/apiculture/ruche
.
Au cours de leur vie, les abeilles occupent différentes fonctions liées à l'entretien des cellules : elles peuvent être nettoyeuse, nourrice, architecte, maçonne, manutentionnaire, ventileuse.
L'entretien des cellule est simulé en utilisant le pattern Visitor.
Chaque visiteur concret correspond à une des fonctions des abeilles.
L'implémentation du visiteur abstrait
Abeille
et des visiteurs concrets Nettoyeuse
et Nourrice
se trouve dans enonce/apiculture/abeilles
.
Questions (les questions sont indépendantes les unes des autres) :
-
Compilez le code fourni, exécutez-le et vérifiez que les deux visiteurs concrets créés dans
main()
(nettoyeuse1
etnourrice1
) visitent bien toutes les cellules deruche1
. -
Dans
main()
, créez une seconde abeille de typeNourrice
dont le nom est "Nourrice 2".
Faites travailler cette abeille surrayon2
(uniquement sur ce rayon, pas sur la ruche entière).
Lors de l'exécution de la fonctionmain()
, vous devez obtenir l'affichage supplémentaire suivant :=== Travail de nourrice2 === Visite de Cellule ouvrière 2_1 par Nourrice 2 Visite de Cellule ouvrière 2_2 par Nourrice 2 Visite de Cellule royale 2_3 par Nourrice 2
-
Implémentez un nouveau visiteur concret :
Ventileuse
.
Son action sur une cellule sera similaire à celles des visiteurs concrets déjà implémentés, c'est à dire afficher une chaîne de caractère du type :Visite de <nom de la cellule> par <nom de l'abeille>
Dansmain()
, créez uneVentileuse
ayant pour nom "Ventileuse 1", et faites la travailler surruche1
.
Vérifiez qu'elle agit bien sur toutes les cellules deruche1
en générant l'affichage suivant :=== Travail de ventileuse1 === Visite de Cellule ouvrière 1_1 par Ventileuse 1 Visite de Cellule mâle 1_2 par Ventileuse 1 Visite de Cellule ouvrière 1_3 par Ventileuse 1 Visite de Cellule ouvrière 2_1 par Ventileuse 1 Visite de Cellule ouvrière 2_2 par Ventileuse 1 Visite de Cellule royale 2_3 par Ventileuse 1 Visite de Cellule ouvrière 3_1 par Ventileuse 1 Visite de Cellule ouvrière 3_2 par Ventileuse 1 Visite de Cellule ouvrière 3_3 par Ventileuse 1
-
On souhaite maintenant modifier le comportement des abeilles de type
Nourrice
de manière à ne rien faire sur les cellules de typeCelluleMale
.-
Proposez une solution en rajoutant un test dans la méthode
Nourrice.visit()
. - Justifiez pourquoi cette solution n'est pas satisfaisante.
-
Cette réflexion conduit à la conclusion que notre pattern Visitor n'est pas correctement implémenté :
Au lieu d'avoir dansAbeille
une seule méthodeabstract public void visit(Node n);
il faut une méthode par type de noeud représenté :abstract public void visit(CelluleOuvriere n); abstract public void visit(CelluleMale n); abstract public void visit(CelluleRoyale n);
Modifiez la classe abeille et ses sous-classes pour répondre à la question de cette manière.
Recompilez, exécutez et vérifiez dans l'affichage que les abeilles de typeNourrice
n'ont plus d'action sur les cellules mâles.
-
Proposez une solution en rajoutant un test dans la méthode