47
ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

Embed Size (px)

Citation preview

Page 1: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE1

Patrons Observateur/MVCprogrammation évènementielle

Notes de cours

jean-michel Douin, douin au cnam point frversion : 9 Septembre 2013

Page 2: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE2

Sommaire

• Patron Observateur

• Programmation évènementielle

• Patron MVC Modèle Vue Contrôleur

Page 3: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE3

Principale bibliographie utilisée

• [Grand00]– Patterns in Java le volume 1

http://www.mindspring.com/~mgrand/

• [head First] – Head first : http://www.oreilly.com/catalog/hfdesignpat/#top

• [DP05] – L’extension « Design Pattern » de BlueJ : http://hamilton.bell.ac.uk/designpatterns/

• [divers]– Certains diagrammes UML : http://www.dofactory.com/Patterns/PatternProxy.aspx– informations générales http://www.edlin.org/cs/patterns.html

Page 4: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE4

Patrons/Patterns pour le logiciel

• Origine C. Alexander un architecte

• Abstraction dans la conception du logiciel– [GoF95] la bande des 4 : Gamma, Helm, Johnson et Vlissides

• 23 patrons/patterns

• Architectures logicielles

Page 5: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE5

Introduction : rappel

• Classification habituelle

– Créateurs  • Abstract Factory, Builder,   Factory Method,  Prototyp,e  Singleton

– Structurels •  Adapter,  Bridge,  Composite,  Decorator,  Facade,  Flyweight,  Proxy

– Comportementaux   Chain of Responsability.  Command,  Interpreter,  Iterator,

  Mediator,  Memento,  Observer,  State,

  Strategy, Template Method, Visitor

Page 6: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE6

Les patrons déjà vus …

• Adapter– Adapte l’interface d’une classe conforme aux souhaits du client

• Proxy– Fournit un mandataire au client afin de contrôler/vérifier ses accès

Page 7: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE7

Patron Observer/observateur

– Notification d’un changement d’état d’une instance aux observateurs inscrits

• Un Observé– N’importe quelle instance qui est modifiée

• i.e. un changement d’état comme par exemple la modification d’une donnée d’instance

• Les observateurs seront notifiés– A la modification de l’observé, – Synchrone, ( sur la même machine virtuelle …)

• Un ou plusieurs Observés / un ou plusieurs observateurs

• Ajout et retrait dynamiques d’observateurs

Page 8: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE8

UML & le patron Observateur, l’original

• http://www.codeproject.com/gen/design/applyingpatterns/observer.gif

Page 9: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE9

Le patron observateur en Java

– Lors d’un changement d’état : notification aux observateurs inscrits

// les observateurspublic interface Observer{

public void update();

}

// les observéspublic interface Subject{

public void attach(Observer o);

public void detach(Observer o);

public void notify();

}

Page 10: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE10

ConcreteObservable

public class ConcreteSubject implements Subject{

private Collection<Observer> observers = new ……

public void attach(Observer observer){ observers.add(observer); }

public void detach(Observer observer){ observers.remove(observer); }

public void notify(){

for(Observer obs : observers)

obs.update();

}

}

Page 11: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE11

ConcreteObserver

public class ConcreteObserver implements Observer{

public void update(){ // une notification a eu lieu …. }

}

Quel est l’observé initiateur ?

Quels sont les paramètres ?

Page 12: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE12

Observer : mise en oeuvre

Observable o = new ConcreteObservable();Observer obs1= new ConcreteObserver();

o.addObserver(obs1);

o.notify(); // obs1 est réveillé

Observer obs2= new ConcreteObserver();

o.addObserver(obs2);

o.notify(); // obs1 et obs2 sont réveillés…

Page 13: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE13

Démonstration / discussion

Page 14: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE14

Observer et ses paramètres …

– A chaque notification l’observé est transmis

public interface Observer{ public void update(Observable obs);}

– A chaque notification l’observé et un paramètre sont transmis

public interface Observer{ public void update(Observable obs, Object param);}

Page 15: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE15

Existe déjà, voir java.util

• java.util.Observable Subject

• java.util.Observer Observer

• java.util.Observer & java.util.Observableupdate addObserver

removeObserver

notifyObservers

….

Page 16: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE16

java.util.Observer

public interface Observer{

 void update(Observable o, Object arg);

}

L’Observé est transmis en paramètre Observable o

accompagné éventuellement de paramètres Object arg

« update » est appelée à chaque notification

Page 17: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE17

java.util.Observable

public class Observable{  public void addObserver(Observer o) ;

public void deleteObserver(Observer o) ;

public void deleteObservers() ;

public int countObservers() ;

public void notifyObservers() ;

 public void notifyObservers(Object arg) ;

 public boolean hasChanged() ;

protected  void setChanged() ;

protected  void clearChanged() ;

}

Page 18: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE18

Un Exemple : une liste et ses observateurs

• Une liste est observée, à chaque modification de celle-ci, ajout, retrait, … les observateurs inscrits sont notifiés

public class Liste<E> extends java.util.Observable{

public void ajouter(E e){

… // modification effective de la liste

setChanged(); // l’état de cette liste a changé

notifyObservers(e); // les observateurs sont prévenus

}

Une liste ou n’importe quelle instance …

Page 19: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE19

Un Exemple : un observateur de la liste

Liste<Integer> l = new Liste<Integer>();

l.addObserver( new Observer(){ public void update(Observable o,Object arg){ System.out.print( o + " a changé, " ); System.out.println( arg + " vient d'être ajouté !"); } });

C’est tout ! démonstration

Page 20: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE20

Démonstration/discussion

Page 21: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE21

EventListener / comme Observer

• java.awt.event.EventListener – Les écouteurs/observateurs

• Convention syntaxique de Sun pour ses API– XXXXXListener extends EventListener

« update » addXXXXXListener

exemple l’interface ActionListener addActionListener

• EventObject comme ActionEvent

Page 22: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE22

Observateur comme XXXXListener

• Une grande famille !

Page 23: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE23

Une IHM et ses écouteurs

• Chaque item est un sujet observable … avec ses écouteurs…

– Pour un « Bouton », à chaque clic les écouteurs/observateurs sont prévenus

public class Button extends Component{

public void addActionListener(ActionListener al){

}

Page 24: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE24

Un bouton prévient ses écouteurs …

Button b = new Button("empiler");

b.addActionListener(unEcouteur); // 1

b.addActionListener(unAutreEcouteur); // 2

b.addActionListener(

new ActionListener(){ // 3 écouteurs

public void actionPerformed(ActionEvent ae){

System.out.println("clic !!! ");

}

});

Une instance de la classe java.awt.Button (observable)notifie à

ses instances inscrites java.awt.event.ActionListener …(observer)

Page 25: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE25

Un écouteur comme Action Listener

import java.util.event.ActionListener;import java.util.event.ActionEvent;

public class EcouteurDeBouton implements ActionListener{

public void actionPerformed(ActionEvent e){ // traitement à chaque action sur le bouton }

}

//c.f. page précédenteActionListener unEcouteur = new EcouteurDeBouton(); b.addActionListener(unEcouteur); // 1

Page 26: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE26

Démonstration / Discussion

Page 27: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE27

API Java, patron Observateur, un résumé

• Ajout/retrait dynamiques des observateurs ou écouteurs

• L’observable se contente de notifier– Notification synchrone à tous les observateurs inscrits

• API prédéfinies java.util.Observer et java.util.Observable

Page 28: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE28

patrons Observer / MVC

• Modèle Vue Contrôleur

agit, modifie le Modèle

Observés / Observateurs

Page 29: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE29

MVC : Observer est inclus

ObservableModèle

ObserverVue

(update)

(getState)

(setState)

Contrôleur

Page 30: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE30

MVC Avantages

• Souple ?

CapteursContrôleur

Liste des mesuresModèle

(1)

CapteursContrôleur

CapteursContrôleur

CapteursContrôleur

CapteursContrôleur

CapteursContrôleur

(1)

HistogrammeVue

(3)

HistogrammeVue

HistogrammeVue

HistogrammeVue

HistogrammeVue

graphiqueVue

(2)

(2)

(3)

Page 31: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE31

Un cycle MVC

Utilisateur

Contrôleur Vue

Modèle

1

2

inscription

3

4

Page 32: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE32

Un cycle MVC, le bouton empiler

Utilisateur

Contrôleur Vue

Modèle

Clic !

empiler

inscription

notification

4

Page 33: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE33

Démonstration / MVC en pratique

• Un Modèle – Plusieurs Contrôleurs– Plusieurs Vues

Page 34: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE34

Démonstration : le Modèle i.e. un Entier

import java.util.Observable;

public class Modèle extends Observable{ private int entier; public int getEntier(){ return entier; }

public String toString(){ return "entier : " + entier; } public void setEntier(int entier){ this.entier = entier; setChanged(); notifyObservers(entier); }}

Vue

Modèle

update notifyObservers

Page 35: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE35

Démonstration : une Vue

public interface Vue{ public void afficher();}

import java.util.Observable;import java.util.Observer;

public class Vue1 implements Vue, Observer{ private Modèle modèle; public Vue1( Modèle modèle){ // inscription auprès du modèle this.modèle = modèle; modèle.addObserver(this); } public void afficher(){ System.out.println(" Vue1 : le modèle a changé : " + modèle.toString()); }

public void update(Observable o, Object arg){ // notification if(o==modèle) afficher(); } }

Vue

Modèle

toString afficher update

Page 36: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE36

Démonstration : un contrôleur

public class Contrôleur1{

private Modèle modèle;

public Contrôleur1(Modèle modèle){

this.modèle = modèle;

}

public void incrémenter(){

modèle.setEntier(modèle.getEntier() +1);

}

}

Contrôleur

Modèle

setEntier

incrémenter

Page 37: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE37

Un modèle, une vue, un contrôleur

// Un Modèle

Modèle modèle = new Modèle();

// Ce modèle possède une vue

Vue vue = new Vue1(modèle);

// un Contrôleur ( déclenche certaines méthodes du modèle)

Contrôleur1 contrôleur = new Contrôleur1(modèle);

contrôleur.incrémenter();

contrôleur.incrémenter();

}

Page 38: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE38

Un modèle, deux vues, deux contrôleurs

// Un Modèle

Modèle modèle = new Modèle();

// deux vues

Vue vueA = new Vue1(modèle);

Vue vueB = new Vue1(modèle);

// 2 Contrôleurs

Contrôleur1 contrôleurA = new Contrôleur1(modèle);

Contrôleur1 contrôleurB = new Contrôleur1(modèle);

contrôleurA.incrémenter();

contrôleurB.incrémenter();

Page 39: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE39

Discussion

Modèle

(1)

CapteursContrôleurContrôleurA

(1)(3)

HistogrammeVueVueA

(2)

(2)

(3)

Page 40: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE40

AWT / Button, discussion

• Un « Button » (le contrôleur) contient un MVCÀ part entière

• Text, TextField, Label, … « sont » des Vues• Button, Liste, … « sont » des contrôleurs

• Une IHM (JApplet,…) contient la Vue et le Contrôle– Alors le compromis architecture/lisibilité est à rechercher

Page 41: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE41

Un JButton comme MVC

• Au niveau applicatif appel de tous les observateurs inscrits– actionPerformed(ActionEvent ae ), interface ActionListener

Utilisateur

IHM JButton Vue du JButton

JButton

Clic !

change Modifier l’aspect du JButton

4

Page 42: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE42

Application, un TP

Développez une application de type calculette à pileL'évaluation d'une expression arithmétique est réalisée à l’aide d'une pile.

Par exemple l'expression 3 + 2 engendre la séquence : empiler(3); empiler(2); empiler(depiler() + depiler()); // simple non ?

Une Interface graphique :

Quel découpage ? Modèle, Vue et Contrôleur ?

Page 43: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE43

Proposition avant discussion

• MVC proposé :– Le Contrôleur est un JPanel,

• Transforme les actions sur les boutons ou l’entrée d’une opérande en opérations sur le Modèle

– Le Modèle est une Pile• Est un « Observable »

– La Vue est un JPanel, • Observateur du Modèle, la vue affiche l’état du Modèle à chaque notification

contrôleur

Vue

– ou bien Le Modèle est une calculette qui utilise une pile•Est un « Observable »

Page 44: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE44

Proposition après discussion

• MVC proposé :– Le Contrôleur est une classe qui implémente tous les listeners

• Transforme les actions sur les boutons ou l’entrée d’une opérande en opérations sur le Modèle

– Le Modèle est une Pile• Est un « Observable »

– La Vue est un JPanel, une JApplet, Une Frame … ce que l’on voit• Observateur du Modèle, la vue affiche l’état du Modèle à chaque notification

Vue

– ou bien Le Modèle est une calculette qui utilise une pile•Est un « Observable »

Page 45: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE45

MVC doc de Sun

• http://java.sun.com/blueprints/patterns/MVC-detailed.html

Page 46: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE46

IHM et MVC assez répandu …

• Discussion– Evolution, maintenance, à la recherche du couplage faible– Exemple

peut-on changer d’IHM ?, peut-elle être supprimée ? peut-on placer le modèle sur une autre machine ? …

Page 47: ESIEE 1 Patrons Observateur/MVC programmation évènementielle Notes de cours jean-michel Douin, douin au cnam point fr version : 9 Septembre 2013

ESIEE47

Conclusion

• MVC– Très utilisé

– Couplage faible obtenu

– Intégration claire du patron Observateur

Modèle Vue Contrôleur (MVC) est une méthode de conception pour le développement

d'applications logicielles qui sépare le modèle de données, l'interface utilisateur et la logique

de contrôle. Cette méthode a été mise au point en 1979 par Trygve Reenskaug, qui travaillait

alors sur Smalltalk dans les laboratoires de recherche Xerox PARC[1].

–Extrait de http://fr.wikipedia.org/wiki/MVC