TP1 : Le patron Observer

De $1

Version de 17:30, 22 Déc 2024

cette version.

Revenir à liste des archives.

Voir la version actuelle

Introduction exhaustive au projet

L'objectif de ce TP est de vous familiariser avec le projet "creatureSimulator" et de vous apprendre à implémenter un pattern Observer.

Pour cela nous vous proposons de prendre en main le projet "creatureSimulator". Ce projet vise à créer un environnement de simulation pour des créatures. Nous fournissons un moteur de simulation générique : ce moteur fonctionne en activant les objets de la simulation à chaque cycle de simulation. Nous fournissons également une visualisation générique de la simulation : celle-ci représente la fenêtre de la simulation et demande à chaque objet de se représenter lui même. Enfin, nous fournissons les classes permettant de faire une simulation de créatures : une définition des créatures (des objets capables de se déplacer dans un environnement) et une implémentation du moteur de simulation implémentant également l'environnement.

L'archive que nous vous donnons contient les 4 packages principaux du projet (décrit ci-dessous) et un package contenant une classe de lancement de la simulation :

  • creatures : gère les classes concernant les créatures ;
  • creatures.visual : gère la visualisation des créatures ;
  • simulator : gère le moteur de simulation ;
  • visual : gère le moteur de visualisation.

Nous décrivons dans la suite l'ensemble des classes et interfaces du projet représentés dans la figure ci-dessous. td1.png

Package visual

Ce package contient les informations permettant de créer une fenêtre de visualisation pour le simulateur.

Il contient les fichiers suivants :

  • IDrawable : interface définissant les méthodes à implémenter pour un objet représentable dans une fenêtre de visualisation ;
  • Visualizer : classe abstraite implémentant les méthodes principales pour la fenêtre de visualisation.
IDrawable

Cette interface définit un type d'objet représentable dans la fenêtre de visualisation et les méthodes que ce type d'objet doit implémenter.

En particulier un tel objet doit pouvoir donner sa couleur, sa taille et définir une méthode paint pour être en mesure de se dessiner dans un JPanel.

Visualizer

Cette classe abstraite donne les principales méthodes permettant de représenter la fenêtre de visualisation. En outre, la classe définit également la signature d'une méthode abstraite permettant de récupérer un ensemble d'objet de type IDrawable ou hérités : getDrawables

Notez que les méthodes données ici sont implémentées pour gérer toutes les questions de positionnement dans le cadre du projet, vous n'aurez jamais à vous en soucier.0

Package simulator

Ce package contient l'ensemble des informations nécessaire au fonctionnement d'un moteur de simulation.

Il contient les fichiers suivants :

  • IActionable : interface définissant le comportement d'un objet simulable ;
  • Simulator : classe définissant un moteur de simulation générique.
IActionable

Cette interface permet de définir un type d'objet qui soit gérable par le moteur de simulation.

Pour correspondre à l'interface une classe doit nécessairement exposer une méthode act(), correspondant à l'activité de l'objet pendant un cycle de simulation.

Simulator

Cette classe définit un moteur de simulation générique. Le moteur est définit pour un type d'IActionable donné (dans notre cas, ICreature).

La classe contient la liste des objets à simuler (attribut actionables), un thread permettant l'exécution du moteur de simulation, d'un booléen gérant l'état de démarrage de la simulation (attribut running) et d'un dernier attribut pour gérer l'intervalle de temps entre chaque cycle d'exécution (attribut executionDelay).

La classe contient la méthode simulate qui permet d'activer chacun des objets de la simulation (via la méthode act()). La méthode start permet de démarrer la simulation via la création d'un thread. Notez que la méthode start peut être appelée avec un booléen afin d'afficher des informations de débug en console.

La classe a été implémentée de telle façon que la gestion du thread soit correcte, vous n'avez jamais à modifier l'implémentation du thread, ni à changer les attributs volatile ou les méthodes synchronized.

Package creature

Ce package contient l'ensemble des informations pour la manipulation (la simulation) des créatures.

Il contient les fichiers suivants :

  • ICreature : interface définissant les méthodes qu'une créature doit exposer ;
  • AbstractCreature : classe abstraite implémentant la majorité des méthodes d'une créature pour un environnement donné (voir package creatures.visual)
  • StupidCreature : classe représentant une créature "stupide" càd se déplaçant en suivant toujours sa trajectoire initiale.
ICreature

Cette interface définit les méthodes qu'une créature doit exposer pour donner son environnement, sa vitesse, sa direction et sa position.

ICreature hérite de l'interface IActionable (voir package simulator) : une créature peut être simulée au sein du moteur de simulation. Elle hérite également de l'interface IDrawable (voir package visual) : une créature peut être représentée à l'écran. 

AbstractCreature

Une créature possède tous les attributs qui lui permettent de se positionner dans un environnement (position et environment), de se déplacer (speed et direction), d'interagir avec d'autres créatures (fieldOfView -> champ de vision et visionDistance) et d'être représentée à l'écran (size et color).

Elle possède également deux méthodes protégées (et donc accessibles dans les classes héritées) pour se mouvoir (move) et tourner (rotate). 

Enfin, une méthode permettant de dessiner la créature (selon sa taille et son champ de vision) est également fournie (paint).

StupidCreature

L'implémentation de cette créature consiste uniquement en l'implémentation de la méthode act() requis par l'interface IActionable. Dans le cadre de la StupidCreature, cette méthode fait se déplacer la créature en utilisant sa vitesse et sa direction. 

Package creatures.visual

Ce package contient les informations permettant la visualisation des créatures dans le cadre d'une simulation de créatures.

Il contient les fichiers suivants :

  • IEnvironment : une interface exposant les méthodes permettant de définir une environnement de simulation pour les créatures ;
  • CreatureSimulator : une classe définissant un moteur de simulation spécifique pour des créatures ;
  • CreatureVisualizer : une classe définissant une fenêtre de visualisation de créatures.
IEnvironment

Une créature ne peut se mouvoir qu'au sein d'un plan. L'interface IEnvironment permet de définir les méthodes exprimant un tel plan : la méthode getDimension permet de récupérer la dimension d'un plan et getCreatures permet d'obtenir l'ensemble des créatures évoluant dans cet environnement. 

CreatureSimulator

Une simulation de créatures ne peut se faire que si le moteur de simulation définit également l'environnement des créatures.

La classe CreatureSimulator hérite donc du moteur de simulation (classe Simulator) en spécifiant qu'elle travaille uniquement avec des ICreature (pour rappel ICreature hérite bien de IActionable) et implémente les méthodes de IEnvironment. Le constructeur de CreatureSimulator utilise une classe CopyOnWriteArrayList pour éviter les problèmes de gestion de liste lors de son utilisation au sein du thread. 

CreatureVisualizer

Cette classe définit une visualisation des créatures dans le cadre d'une simulation de créatures. Elle possède donc une référence vers une simulation de créature (attribut simulator). Elle hérite par ailleurs de la classe abstraite Visualizer et implémente donc la méthode getDrawables.

Cette classe implémente une réaction sur un événement correspondant au click sur un bouton de souris : suivant l'état du moteur de simulation, elle va arrêter ou démarrer la simulation lors du click. 

Déroulement