:: Enseignements :: Master :: M1 :: 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 un argument au main pour pouvoir choisir la forme à afficher
("rectangle" pour un rectangle et "line" pour une ligne).
Puis ajouter aussi en arguments de la ligne de commande les coordonnées des deux points pour pouvoir choisir aussi sa position.
Exercice 2 - découplons !
-
Pour l'instant, notre programme principal 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.
Exercice 3 - Industrialisation
Exercice 4 - nouvelles formes
-
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).
remarque: pour l'instant, on ne cherche pas à paramétrer la couleur. vous devez donc écrire une classe BlackRectangle dont le constructeur aura exactement les mêmes paramètres que la classe Rectangle.
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 ajouter / modifier ?
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 5 - 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 6 - 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 dessiné
(en dessinant un rectangle blanc) puis à dessiner la forme à une autre position.
-
On veut pouvoir faire bouger n'importe quelle 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.
-
Introduisez une nouvelle classe ShapeGrouping pour grouper des formes de base.
Pour cette question, on ne s'intéresse pas à la manière dont les groupes sont créés.
-
Comment faites-vous pour faire bouger un groupe ? (soyez astucieux pour que cela soit simple !)
© Université de Marne-la-Vallée