# Minipaint ## TP2 – De l'observer Le patron *Observer* est certainement le plus couramment utilisé. Il est d’ailleurs déjà utilisé à plusieurs reprises dans notre application, mais on découvrira cela tout à l’heure. D’abord, nous allons implémenter le patron *Observer* pour ajouter une nouvelle fonctionnalité à l’application. On veut rajouter une barre de statut horizontale, en bas de la fenêtre. Cette barre indiquera le nombre de formes géométriques dessinées, et devra être mise à jour à chaque forme ajoutée ou supprimée. >**🖥 TODO** > > - Commencez par créer une nouvelle classe `StatutBar`, qui héritera de `HBox`, et qui contiendra un attribut de type `Label` dans lequel on affichera le nombre de formes. > - Ajoutez une instance de cette classe dans l’interface, en la positionnant en bas de la fenêtre. Inspirez-vous du style CSS de la barre d’outils pour lui appliquer un style similaire (mais cette fois avec une bordure en haut). ![Screenshot](./images/minipaint_02.png) La barre de statut est bien créée, mais pour l’instant elle « ne sait rien » des formes qui sont dessinées. 🤷🏼‍♂️ Reprenez l’exemple vu en cours illustrant le fonctionnement du patron *Observer* et cherchez à l’appliquer notre problème : >**🖥 TODO** > > - Identifiez le ***sujet*** (« émetteur », ou « observable ») : quelle est la classe qui contient l’information clé, et qui pourra avertir les autres qu’il y a eu un changement ? > - Qui est l’***observateur*** (ou « abonné », ou « observer ») qui doit recevoir les notifications, être mis à jour ?
🏅 Excellent, vous avez identifié les deux classes impliquées dans ce patron ! Il ne reste plus qu’à coder : >**🖥 TODO** > > - Créez une interface `Observer`, contenant la méthode : > public void update() ; > > - Modifiez les deux classes identifiées précédemment : > - Le ***sujet*** doit pouvoir gérer une liste d’observateurs (on doit pouvoir en ajouter, en retirer), et les notifier lorsqu’il effectue un changement. > - L’***observateur*** doit implémenter l’interface `Observer` > - Finalement, n’oubliez pas que l’observateur doit s’abonner auprès du sujet pour recevoir les notifications ! > - Ah oui, dernière chose : pensez à créer un test pour vérifier le bon fonctionnement de votre barre de statut…
### 🦸🏻‍♂️ Un patron déguisé --- En réalité, le patron *Observer* est déjà utilisé à plusieurs reprises dans l’application ! Par exemple, intéressons-nous à la classe `ClearButtonHandler`. Cette classe implémente l’interface `EventHandler`, du package `javafx.event`. >**🖥 TODO** > > - À quoi sert la classe `ClearButtonHandler` ? > - Quel est l’objectif de la méthode `handle` proposée par l’interface `EventHandler` ? > - À quel moment sera appelée la méthode `handle` ? > - Comment le lien est-il fait entre la classe `ClearButtonHandler` et le bouton de l’interface ? > - Quel parallèle pouvez-vous faire avec le patron *Observer* ?
Creusons encore un peu et cherchons à comprendre le fonctionnement de la classe `ShapeButtonHandler` et de ses sous-classes, comme `RectangleButtonHandler`. >**🖥 TODO** > > - Quels sont les différents événements que la classe `RectangleButtonHandler` écoute, et quelles sont leur provenance ? Repérez les différents endroits où cette classe (ou sa super-classe) s’enregistre pour écouter ces événements. > - Reconstituez le diagramme de séquence décrivant ce qui se passe lors de la création d’un nouveau rectangle, depuis le clic sur le bouton « Rectangle ».
En fait, la classe `RectangleButtonHandler` est très curieuse : elle observe beaucoup de choses !! 🦹🏼‍♀️
[🔙 Retour](../README.md)