Exercice : Ruche (Visitor)

(Extrait examen 2018 - 7 points)

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) :
  1. Compilez le code fourni, exécutez-le et vérifiez que les deux visiteurs concrets créés dans main() (nettoyeuse1 et nourrice1) visitent bien toutes les cellules de ruche1.
  2. Dans main(), créez une seconde abeille de type Nourrice dont le nom est "Nourrice 2".
    Faites travailler cette abeille sur rayon2 (uniquement sur ce rayon, pas sur la ruche entière).
    Lors de l'exécution de la fonction main(), 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
    
  3. 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>
    Dans main(), créez une Ventileuse ayant pour nom "Ventileuse 1", et faites la travailler sur ruche1.
    Vérifiez qu'elle agit bien sur toutes les cellules de ruche1 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
    
  4. On souhaite maintenant modifier le comportement des abeilles de type Nourrice de manière à ne rien faire sur les cellules de type CelluleMale.
    1. Proposez une solution en rajoutant un test dans la méthode Nourrice.visit().
    2. Justifiez pourquoi cette solution n'est pas satisfaisante.
    3. Cette réflexion conduit à la conclusion que notre pattern Visitor n'est pas correctement implémenté :
      Au lieu d'avoir dans Abeille une seule méthode
      abstract 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 type Nourrice n'ont plus d'action sur les cellules mâles.