:: Enseignements :: ESIPE :: E4INFO :: 2013-2014 :: Programmation Orientée Objet - Design Pattern ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Factory |
Des usines spécialisées et bien nommées
Le but de ce TD est de mettre en pratique les Design Patterns Factory.
Exercice 1 - Dessinons ...
Dans un premier temps, nous allons chercher à dessiner des rectangles et des lignes à l'écran.
Pour cela, une 'librairie' graphique minimaliste vous est fournie ,
CanvasArea.java
L'espace à votre disposition a une taille fixe de 800 x 600 pixels à l'écran.
Les coordonnées utilisées sont des coordonnées pixels: [0-799] x [0-599].
Classiquement, le point (0,0) est situé en haut à gauche de la fenêtre.
Exemple de ce que votre code doit être capable de faire
CanvasArea area = new CanvasArea("hello canvas area", 800, 600);
Line line = new Line(0, 0, 100, 50);
line.draw(area);
-
Créer une classe Line avec un constructeur prenant les deux points de la ligne en argument.
Implémentez la méthode draw(CanvasArea) qui dessine la ligne sur le CanvasArea.
Ecrivez un main de test pour visualiser le résultat.
-
Créer une classe Rectangle avec un constructeur prenant deux points d'une des diagonales du rectangle en argument.
Implémentez la méthode draw(CanvasArea) qui dessine le rectangle sur le CanvasArea.
Modifiez le main de test pour visualiser le résultat.
-
Pour l'instant, tout est "en dur" dans notre code :(
On veut pouvoir choisir la forme à afficher au lancement du programme : ajouter une option au main pour pouvoir choisir la forme à afficher
("rectangle" pour un rectangle et "line" pour une ligne).
Puis ajouter aussi les coordonnées des deux points pour pouvoir choisir aussi sa position.
-
Pour l'instant, notre programme principale n'est capable d'afficher que deux formes géométriques.
Et ces deux formes doivent être connues à la compilation.
On veut rendre notre main plus souple, plus évolutif fonctionnellement, sans avoir à le modifier et à le re-tester sans arrêt.
-
Première étape : Il faut définir l'abstraction "Forme géométrique".
Utilisez "Extract interface" d'Eclipse pour créer l'interface Shape.
-
Deuxième étape : enlever les new Line() et new Rectangle() du main. Où les mettez-vous ?
-
Refaites marcher votre exemple avec cette nouvelle manière de créer les objets.
-
Notre programme ne permet de créer qu'une ligne ou un rectangle, cela ne nous suffit plus !
On veut pouvoir définir un fichier de description du dessin : un fichier texte contenant une instruction de dessin par ligne.
Par exemple
line 0 0 100 50
rectangle 20 25 150 180
Ajouter une option pour prendre en argument le chemin de ce fichier et faites marcher votre programme.
Il existe la classe java.util.Scanner qui permet de lire une entrée formatté en Java
(comme scanf, fscanf en C).
-
Notre programme ne permet de créer que des lignes ou des rectangles, cela ne nous suffit plus !
On veut pouvoir étendre la liste des formes géométriques supportées.
Dans un premier temps, ajoutez le support des rectangle plein (l'intérieur du rectangle est dessiné en noir, comme son contour.
Quelles classes avez-vous ajoutées/modifiées ?
Que remarquez-vous concernant votre programme main ?
-
On veut maintenant ajouter des cercles : un cercle est défini par son centre et son rayon.
Quelles classes allez-vous ajoutées/modifiées ?
Quel problème spécifique pose l'ajout de cette nouvelle forme ? Que proposez-vous pour résoudre élégamment le problème ?
Que remarquez-vous concernant votre programme main ?
Exercice 2 - Encore plus souple ?
Un collègue trouve que nos dessins sont moches, manque de couleur, etc... !
Il n'est pas question qu'il modifie nos classes de Shape; par contre, on lui propose de nous fournir sa propre version des classes de Shape.
On ne veut pas avoir à modifier notre programme main ... ou alors vraiment très peu.
-
Que doit-il minimalement nous fournir ?
Faites une version simple avec juste un peu de couleur.
Quelles classes existantes avez-vous modifiées ?
-
Un autre collègue nous fait la même demande !
Il semble inconcevable de modifier comme cela sans arrêt notre main(),
que pouvez-vous faire pour que l'usine de Shape ne soit pas référencée "en dur" dans le programme main ?
Pensez à la reflection en Java, à Class.forName() et Class.newInstance.
Testez votre solution avec les deux hiérarchies de Shape que vous avez implémentées.
Exercice 3 - Move it! [Pour aller plus loin]
On veut pouvoir sélectionner une forme et la faire ensuite bouger.
-
Après un délai de 3 secondes, Faites bouger la première des formes affichées de (10,30) pixels
L'astuce pour faire bouger quelque-chose consiste à effacer ce qui était dessiner
(en dessinant un rectangle blanc) puis à dessiner la forme à une autre position.
-
On veut pouvoir faire bouger n'importe quel forme:
-
Pensez à mémoriser toutes les formes affichées
-
La librairie vous permet d'écouter la souris pour obtenir ses coordonées avec la méthode waitForMouseEvents.
Déterminez un algorithme simple pour sélectionner une forme d'après cette coordonnées.
Pensez à reponsabiliser les formes...
-
Faites bouger la forme sélectionnée
-
Groupe de formes
-
Reprenez les fichiers de configurations et introduisez la notion de groupe de formes :
simplement avec des lignes "begin" et des lignes "end" qui délimitent les formes appartenant à un groupe.
-
Comment prendre en compte ce nouveau besoin ? Quelles nouvelle(s) classe(s) avez-vous définie(s) ?
-
Vérifiez que le dessin fonctionne correctement.
-
Faites bouger un groupe ! Comment vous y prenez-vous ?
Le code est-il compliqué ? Si oui, simplifiez-le !
© Université de Marne-la-Vallée