:: Enseignements :: Master :: M1 :: 2014-2015 :: Design Pattern ::
[LOGO]

Hierarchie de composants




Exercice 1 - Retours sur vos rendus ...

Exercice 2 - Composants graphiques

On souhaite créer une hierarchie de types representant des composants graphiques. Un composant graphique s'occupe d'une zone rectangulaire de l'écran qu'il va remplir d'information différentes pour chaque composants
Pour effectuer le dessin, nous réutiliseront la librarie graphique CanvasArea
De plus, deux composants de base on déjà été écrit, ColoredFiller et Icon





Ainsi qu'une image composite.png pour tester le composant Icon

  1. On peut noter que la classe Rect a ses champs déclarés public et final, comme une structure en C.
    Quel est le problème d'un tel design ?
    Est-ce grâve docteur ?
  2. On souhaite créer une classe VBox permettant de placer des composants verticalement en divisant la place disponible en largeur par le nombre de composants.
     
    La première image est une VBox contenant 3 composants, la seconde est une VBox contenant elle-même une VBox.
    Quelle design pattern utiliser ?
    Implanter la classe VBox.
  3. On souhaite implanter un mécanisme optionnel d'ombrage (drop shadow en anglais) sur le composant ColoredFiller. Une ombre se fait en dessinant un rectangle grisé *avant* le dessin du composant.
    	       area.drawRectangle(zone.x + 9, zone.y + 9, zone.width - 10, zone.height - 10, Brush.DARK_GRAY.asOpaque());
    	     
    • Comment devez vous modifier votre code ?
    • Et si on veut le même mécanisme d'ombrage sur tous les composants ? Comment devez vous modifier votre code ?
    • Et si on veut pouvoir décorer tous les composants avec une autre décoration que drop shadow ?
      Quelle design pattern allez vous utiliser ?
    Implanter le design pattern retenu.
  4. On souhaite implanter un nouveau composant qui permet de placer des composants sur une grille (grid box) dans laquelle chaque composant doit faire la même taille en largeur et en hauteur, cette taille est pris en paramètre lors de la création de la grille. La grille place les composants de gauche à droite, si il n'y a pas de place à droite, le composant est placé sur la ligne suivante.

    L'algorithme de placement écrit en pseudo-code est celui-ci:
    	     cw est égal à la largueur pour tous les composants
    	     ch est égal à la hauteur pour tous les composants
    	     wCount est égal à la largeur de la zone courante divisée par componentWidth
    	     hCount est égal à la hauteur de la zone courante divisée par componentHeight
    	     index est égale à 0
    	     pour i de 0 à hCount
    	       pour j de 0 au wCount
    	         si il reste des composants à placer
    	           dessiner le composant numéroté index dans la zone rectangulaire
    	             définie par les coordonées:
    	             début de la zone courante en x + i * cw, début de la zone courante en y + j * ch , cw, ch
    	           incrémenter index
    	         sinon
    	           l'algorithme est terminé
    	     

    On veut bien sûr éviter de dupliquer le code de VBox !
    • Proposer un diagramme UML à base d'héritage pour résoudre ce problème.
    • Proposer un diagramme UML à base de délégation pour résoudre ce problème.
    • Quelle solution vous semble la meilleur ?
      Implanter celle-ci.

Exercice 3 - Récapitulatif