
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
Premier exemple d'implantation de ce pattern en Java.
Classes retenues et propos�e dans le paquetage "question1" :
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
Extrait du code de v�rification : classe "PatternObservateur"
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 Stackparameters(){...}"
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".
Compl�tez les 3 m�thodes de test de la classe "PatternObservateur".

(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 :
Compl�ter les classes IHMQuestion2_1 et JButtonObserver afin d'obtenir les m�mes copies �cran
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
- 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

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

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.
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 :
Selon "MVC" la classe PileModele<T> h�rite de la classe Observable et impl�mente PileI
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.

Par exemple
Proposer votre architecture MVC , un sch�ma de type diagramme UML, les interfaces java et votre proposition en quelques lignes sur votre rapport suffiront.
- 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.

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());
}
}