Lecture pr�alable :

Pattern Observateur/Observ�
Soit le Pattern Observateur en notation UML selon LA r�f�rence en pattern : "Design Patterns Elements of Reusable Object-Oriented Software" , Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides (GOF) , ed. Addison-Wesley, 1995. (existe en fran�ais)

En Java, le paquetage java.util impl�mente ce Pattern.

Il propose la classe Observable pour "Subject" du diagramme ci dessus et l'interface Observer (m�me nom dans le diagramme ci dessus) (lire leur javadoc dans la documentation JAVA).

Les participants
  • L'observ� : la classe Subject ou java.util.Observable
  • L'observateur : ici l'interface Observer ou java.util.Observer
  • L'observ� concret : la classe ConcreteSubject qui h�rite de Observable
  • L'observateur concret :la classe ConcreteObserver , qui impl�mente l'interface Observer, et qui utilise une r�f�rence du sujet ConcreteSubject qu'il observe et r�agit � chaque mise � jour

Premier exemple d'implantation de ce pattern en Java.

Classes retenues et propos�e dans le paquetage "question1" :
  • La classe ConcreteSubject h�rite de java.util.Observable (l'observ�) et g�re une liste de chaines (String), chaque modification de cette liste - introduction d'une nouvelle cha�ne - (cf. m�thode insert) engendre une notification aux observateurs en passant la nouvelle cha�ne en param�tre...
  • La classe ConcreteObserver (observateur) � chaque notification, affiche cette nouvelle cha�ne et m�morise l'origine des notifications (attribut "senders") et les param�tres transmis (attribut "parameters").
  • La m�morisation du notifiant et du param�tre transmis utilise deux piles (java.util.Stack), senders et arguments, accessibles de l'"ext�rieur" par les m�thodes "public Stack senders(){...}" et "public Stack parameters(){...}"

Pour cette premi�re question, nous souhaitons d�velopper une classe de tests afin de "v�rifier" le fonctionnement de l'implantation de ce Pattern,

Quelques exemples de "validation", d'assertions
  • V�rifier que lors d'une notification, TOUS les observateurs ont bien �t� inform�s,
  • V�rifier que les arguments ont bien �t� transmis
  • V�rifier que le notifiant est le bon ...etc ...

Extrait du code de v�rification : classe "PatternObservateur"
public class PatternObservateur extends junit.framework.TestCase {

    public void testNotify() {
        ConcreteSubject list;
        ConcreteObserver observer;

        list = new ConcreteSubject();           // création d'un "observé" constitué d'une liste
        observer = new ConcreteObserver();      // création d'un observateur
        list.addObserver(observer);             // ajouter cet observateur à la liste
        list.insert("il fait beau, ce matin");  // modification de cette liste, l'observateur doit
                                                // (dervrait) être notifié

        // "vérification" :
        assertFalse(observer.senders().empty());                            // elle ne doit pas être vide,
        assertEquals(list, observer.senders().pop());                       // est-ce le bon émetteur ?
        assertEquals("il fait beau, ce matin", observer.arguments().pop())// le paramètre reçu est-il correct ?
    }
    //...

Un exemple de test avec BlueJ: v�rification qu'un observateur est bien notifi� avec le param�tre bien re�u.

Compl�tez les 3 m�thodes de test de la classe "PatternObservateur".


Introduction aux �v�nements de l'AWT
(paquetage java.awt.event, �v�nements engendr�s par une instance de la classe javax.swing.JButton)

En java, les api AWT ou SWING utilise le pattern Observateur pour la gestion des �v�nements, seuls les noms des m�thodes diff�rent. Les notifications sont ici engendr�es par un changement d'�tat de l'interface graphique : un clic sur un bouton, un d�placement de souris, etc...

Exemple :
  • La classe Observable "est remplac�e par" la classe javax.swing.JButton
  • La m�thode addObserver(Observer o) "correspond �" addActionListener(ActionListener l)
  • La m�thode notifyObservers(Object arg) "est remplac�e par" actionPerformed(ActionEvent ae)
  • L'interface Observer "est remplac�e par" l'interface java.awt.event.ActionListener
A chaque clic, un ou plusieurs observateurs sont r�veill�s :
  • Le bouton A a 3 observateurs (jbo1, jbo2 et jbo3)

 

  • Le bouton B a 2 observateurs (jbo1 et jbo2)

 

  • Le bouton C a 1 observateur (jbo1)

Compl�ter les classes IHMQuestion2_1 et JButtonObserver afin d'obtenir les m�mes copies �cran

 


La classe JMouseObserver
 
Cette fois :
  • La m�thode addObserver est remplac�e par java.awt.event.addMouseListener.
  • La m�thode notifyObservers() est remplac�e par mouseXXXXX(MouseEvent ae).
  • L'interface Observer est remplac�e par l'interface java.awt.event.MouseListener.

A chaque d�placement de la souris vers  l'un des boutons, un observateur est r�veill� :

 

  • Le bouton A a 4 observateurs (jmo1) et (jbo1, jbo2 et jbo3), ici la souris est entr�e sur le bouton A
  • la souris est entr�e et un clic a eu lieu sur le bouton A(cf. question2_1)

 

  • D�placement vers le  bouton B avec un clic

 

  • d�placement vers le bouton C avec un clic

 

Compl�ter les classes IHMQuestion2_2 et JMouseObserver afin d'obtenir les m�mes copies �cran




 


Le mod�le MVC


source : Java BluePrints Model-View-Controller


Selon le "pattern MVC" (Mod�le-Vue-Contr�leur)
  • Le Mod�le contient la logique et l'�tat de l'application, il pr�vient ses observateurs lors d'un changement d'�tat.
  • La Vue repr�sente l'interface utilisateur.
  • Le Contr�leur assure la synchronisation entre la vue et le mod�le.
D�veloppez une application de type calculette � pile, selon le paradigme MVC

L'�valuation d'une expression arithm�tique peut �tre r�alis�e par l'usage d'une pile d'entiers

Par exemple l'expression 3 + 2 engendre la s�quence :
    empiler(3);
    empiler(2);
    empiler(depiler() + depiler());
de m�me que l'expression 3 + 2 * 5 correspond � la s�quence :
    empiler(3);
    empiler(2);
    empiler(5);
    empiler(depiler() * depiler());
    empiler(depiler() + depiler());
L'architecture logicielle induite par l'usage du paradigme MVC nous donne

  • Le Mod�le est une pile (classe PileModele<T>).
       Le Mod�le lors d'un changement d'�tat pr�vient ses observateurs.

  • La Vue correspond � l'affichage de l'�tat de la pile (classe Vue).
       La vue s'inscrit aupr�s du Mod�le lors de l'appel du constructeur d'une Vue, � chaque notification, la vue s'enquiert de l'�tat du mod�le et l'affiche.

  • Le Contr�leur g�re les �v�nements issus des boutons +, -, *, /,[] (classe Controleur).
       Le contr�leur g�re localement les �couteur(Listener) des boutons de l'IHM, notons que la gestion des boutons utilise une architecture MVC.

  • L'IHM cr�e, assemble le mod�le, la vue et le contr�le (classe IHMCalculette).

Une des impl�mentations des piles issue du tp3, est install�e dans le package tp3, proposer l'impl�mentation des classes PileModele et Contr�leur.

Selon "MVC" la classe PileModele<T> h�rite de la classe Observable et impl�mente PileI, � chaque changement d'�tat, modification de la pile les observateurs inscrits seront notifi�s.

La pile du tp3, sans modification, est utilis�e, seules certaines m�thodes seront red�finies, enrichies, d�cor�es...

La classe Controleur impl�mente les actions, �v�nements engendr�s par l'utilisateur, � chaque op�ration souhait�e le contr�leur alt�re les donn�es du mod�le de la pile, celle-ci � chaque occurrence d'un changement d'�tat pr�vient ses observateurs, la vue en est un.


Une AppletteCalculette au comportement souhait� devrait �tre ci-dessous :



Aucune interface ? ex�cutez cette commande >appletviewer http://jfod.cnam.fr/progAvancee/tp4/tp4.html

Notez qu'un mauvais format de nombre ou une division par z�ro n'ont aucune incidence.

Soumettez cette question � JNEWS avant de poursuivre.


Critiquez cette proposition d'architecture
Par exemple
  • Le mod�le pourrait �tre la calculette constitu�e pour ses calculs internes d'une pile,
  • Pourquoi les "listeners" des boutons sont-ils locaux au contr�leur ?
  • Ce choix de d�coupage MVC vous parait-il r�aliste ?
  • ...

Proposer votre architecture MVC , un sch�ma de type diagramme UML, les interfaces java et votre proposition en quelques lignes sur votre rapport suffiront.


Postliminaire ou modification de l'application respectant le principe "MVC"
Ajouter cette nouvelle Vue au mod�le, v�rifiez que seule la classe IHMCalculette est concern�e par cet ajout, et que les modifications du source sont mineures.
public class Vue2 extends JPanel implements Observer {
  
  private JSlider jauge;
  private PileModele<Integer> pile;

  public Vue2(PileModele<Integer> pile) {
    super();
    this.pile = pile;
    this.jauge = new JSlider(JSlider.HORIZONTAL, 0, pile.capacite()0);
    this.jauge.setValue(0);
    setLayout(new FlowLayout(FlowLayout.CENTER));
    this.jauge.setEnabled(false);
    add(this.jauge);
    setBackground(Color.magenta);
    pile.addObserver(this);
  }

  public void update(Observable obs, Object arg) {
    jauge.setValue(pile.taille());
  }

}

Cette modification n'est pas � soumettre � JNEWS.
(Ce n'est pas l'IHM attendu, et cela engendrerait des erreurs...)
Une copie d'�cran sur votre rapport suffira.