Le patron Visiteur

De $1

Les formes géométriques

Cet exercice est une application directe du cours.

Classe abstraite AFormeGéométrique

 Une forme géométrique est un objet qui a

  • une position d'ancrage que l'on peut lire et modifier ;
  • une bounding box (rectangle contenant la forme).

Proposer une classe abstraite AFormeGéométrique qui gère la lecture et la modification du point d'ancrage.

Les formes pré-définies

Proposer une classe Java pour réaliser les formes géométriques suivantes : 

  • rectangle ;
  • carré ;
  • cercle ;
  • ellipse ;
  • ligne ;
  • texte ;
  • une forme composite qui contient d'autres formes.

Visiteurs

PrettyPrint

Sur le modèle du cours proposer un visiteur de formes géométriques qui affiche la structure des formes géométriques. 

Application

Proposer une application Java qui teste un scénario possible dans lequel des formes géométriques sont créées (une de chaque) et qui affiche sur la console les informations sur chacune de ces formes.

Dessin

Proposer une application Swing ou une applet Java qui teste un scénario possible dans lequel les mêmes formes géométriques sont créées (une de chaque) et sont dessinées. 

Les couleurs

Modifier la classe AFormeGéométrique pour qu'elle gère un champ pour la couleur de fond et un champ pour la couleur de dessin.

  • Quel est le type de ces champs ? (cf. la classe java.awt.Color)
  • Quel est l'impact sur les classes concrètes ?
  • Pour les formes composites, les formes contenues utilisent les couleurs du composite si elles n'ont pas de couleur "propre"

Les paramètres de centrage

Pour l'instant, nous avons supposé que le point d'ancrage était:

  • le coin supérieur gauche pour le rectangle (et le carré);
  • le centre pour l'ellipse (et le cercle).

On veut pouvoir choisir les propriétés d'ancrage et donc les alignements horizontaux et verticaux.

  1. Proposer un typé énuméré qui permet d'aligner à gauche, de centrer ou d'aligner à droite.
  2. Ajouter les champs et les méthodes nécessaires pour gérer l'alignement.
  3. Quelles sont les méthodes et les classes qu'il faut modifier pour faire cela ?

Les bébêtes

Vous pouvez faire ce TP quelle que soit votre avancée dans le TP sur la simulation de nuées. Y compris, dans le pire des cas, vous pouvez mettre en place la structure de visiteur à partir du source initial.

On voudrait être capable de répertorier les bébêtes à un instant donné. C'est-à-dire savoir combien il y a de bébêtes émergentes, combien il y a de bébêtes hazard, combien de bébêtes sont décorées et par qui, quelles sont leurs stratégies. Pour cela nous allons comparer deux solutions (avec et sans visiteur).

Sans les visiteurs

Le patron visiteur est simplement une façon pour organiser le code, il n'y a pas de code en plus ou en moins. Il est donc important de faire cette partie, tout le code que vous écrirez sera réutilisé dans la deuxième partie.

Modifier vos bébêtes pour répertorier les bébêtes. Si vous partez du code initial (celui pour lequel le patron visiteur est le moins intéressant) on affichera au minimum le nombre de bébêtes (total, émergentes, hasard), la position moyenne et la vitesse moyenne. Si vous partez d'un code plus avancée (avec décorateur ou stratégie) on affichera également le nom des décorateurs (le cas échéant) et la stratégie utilisée par chaque bébête.

Proposer deux versions :

  • Une première qui affiche le résultat dans un fichier de log
  • La deuxième qui affiche le résultat dans l'écran de simulation

Attention, il ne s'agit pas de compter les bébêtes à la création mais bel et bien de faire l'inventaire des bébêtes à un moment donné.

Avec les visiteurs

Implanter une structure de visiteurs pour visiter les objets "Positionnable" et les "Bebetes". 

Proposer une nouvelle implanter qui utilise les visiteurs.

Utiliser le visiteur pour dessiner les bébêtes (et les décorateurs). En pratique, on veut enlever la méthode seDessine dans l'interface Dessinable. De telle sorte, les bébêtes ne sont alors plus dépendantes de la classe Graphics.