Vous n'êtes pas connecté. Connexion
|
|
User:SimonUrli > Patrons de Conception > TP1 : Le patron Observer
TP1 : Le patron ObserverDe $1Table des matières
Introduction exhaustive au projetL'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 :
Nous décrivons dans la suite l'ensemble des classes et interfaces du projet représentés dans la figure ci-dessous. Package visualCe package contient les informations permettant de créer une fenêtre de visualisation pour le simulateur. Il contient les fichiers suivants :
IDrawableCette 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 VisualizerCette 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 : 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 simulatorCe package contient l'ensemble des informations nécessaire au fonctionnement d'un moteur de simulation. Il contient les fichiers suivants :
IActionableCette 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 SimulatorCette 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 La classe contient la méthode 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 Package creatureCe package contient l'ensemble des informations pour la manipulation (la simulation) des créatures. Il contient les fichiers suivants :
ICreatureCette 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. AbstractCreatureUne créature possède tous les attributs qui lui permettent de se positionner dans un environnement ( Elle possède également deux méthodes protégées (et donc accessibles dans les classes héritées) pour se mouvoir (move Enfin, une méthode permettant de dessiner la créature (selon sa taille et son champ de vision) est également fournie ( Package creatures.visualCe package contient les informations permettant la visualisation des créatures dans le cadre d'une simulation de créatures. Il contient les fichiers suivants :
IEnvironmentUne 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. CreatureSimulatorUne 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 CreatureVisualizerCette 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 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éroulementInitialisationTélécharger l'archive contenant le code source du projet : td1-init.zip. A partir de cette archive, créez un nouveau projet dans eclipse et lancez le à partir de la classe Launcher.java. Vous pouvez constater l'ouverture d'une fenêtre contenant une unique créature qui reste statique. Si vous jetez un oeil sur la console vous voyez cependant des chiffres défiler, correspondant aux coordonnées (la position) de la créature. Réparation de la visualisationLa créature devrait normalement bouger dans la fenêtre. L'implémentation n'est pas complète ou a mal été réalisée.
Un autre problème...Essayez de redimensionner la fenêtre de visualisation : que se passe-t-il maintenant ? Comment régler ce problème ? (aide : jetez un oeil à la documentation de la classe Component et aux événements qu'elle peut renvoyer. Pour rappel, Visualizer hérite de JPanel qui est un Component.) En quoi, la résolution de ce problème correspond également à une implémentation du pattern Observer ? Où dans le code voyez-vous également ce même type d'utilisation ?
Mots clés:
|
Powered by MindTouch Deki Open Source Edition v.8.08 |