Vous êtes sur la page 1sur 24

2

JAVA
Applications interactives Modle Vue-Contrleur (MVC)

Introduction
6h00 de cours
Programmation dapplications interactives en Java
Structure dune application interactive: le modle MVC
(1-2h00) (4-5h00)

Les interfaces graphiques en Java: AWT et Swing

Stphane HUOT Dpt. Informatique


DUT Informatique - S3 - 2009
3 4

Introduction
Notions retenir:
Bla bla bla Bla bla bla

Introduction
Pas de distribution des transparents du cours Mais Mise en ligne du pdf aprs le cours Prenez des notes, je dis des choses intressantes et utiles parfois

Point important:

Plan du cours
1. Structure dune application interactive o Ce que lon !fait! et que lon !voit! o Ce quil se passe 2. Ralisation dapplications interactives: Modle-Vue-Contrleur (MVC) o Le modle o La vue o Le contrleur 3. Utilisation et ralisation de MVC o Analyse en terme de MVC o Ralisation en Java: 2 exemples pour dmarrer

Plan du cours
1. Structure dune application interactive o Ce que lon !fait! et que lon !voit! o Ce quil se passe 2. Ralisation dapplications interactives: Modle-Vue-Contrleur (MVC) o Le modle o La vue o Le contrleur 3. Utilisation et ralisation de MVC o Analyse en terme de MVC o Ralisation en Java: 2 exemples pour dmarrer

Application interactive
Une application avec laquelle lutilisateur peut interagir: o Lapplication effectue des oprations en rponse aux actions de lutilisateur o Coopration entre le programme et lutilisateur, commande par lutilisateur

Programmer des applications interactives


Tche pouvant se rvler complexe:
o

Parce que la tche que doit accomplir lutilisateur peut tre complexe Parce quil faut prvoir les scenarios dinteraction (et donc les ractions de lapplication) Parce quil faut pouvoir maintenir et rutiliser

Ex: iTunes - Apple

"
o

Passage lchelle (application importante)

Est-ce quun shell (ligne de commandes) est une application interactive ?

10

Programmer des applications interactives


Heureusement, il y a: o Des concepts (structures et modles dapplications interactives)

o

Structure dune application interactive


La partie visible (front office): ce que lon fait et ce que lon voit
o

MVC PAC Nombreux Design patterns (patrons de conception)

Interface Homme-Machine (IHM)

Des outils (pour concrtiser ces concepts)


Des langages/environnements de programmation adapts Librairies et leurs APIs (Application Programming Interfaces): botes outils

La partie invisible (back office): ce quil se passe


o o o

Traitements Donnes (stockage et accs) Communications

11

12

Structure dune application interactive:

Ce que lon fait et ce que lon voit

Structure dune application interactive:

Ce que lon fait et ce que lon voit

La tche de lutilisateur et lIHM de lapplication


o o

Interface non graphique:


Ex: Ligne de commande, tableau de commandes et indicateurs,

Les entres (ce que lon fait) et Les sorties (ce que lon voit)

Interface graphique (GUI):


Ex: Application standard Windows, page web,

Lutilisateur commande lapplication (programmation vnementielle)


o o

LIHM doit tre adapte la tche (cf PIG en S2) Lapplication doit tre ractive (pas de traitements trop longs ou alors les notier lutilisateur)

13

14

Les entres

Les sorties

15

16

Exemple: Jeu dchecs


La tche globale: jouer aux checs!
o

Structure dune application interactive:


Ce quil se passe

Le noyau de lapplication:
o o o

Sous-tche: dplacer les pices

Interfaces utilisateur:

Fonctionnalits Accs aux donnes Traitement des donnes

ou

Les donnes Produit les rsultats aux actions de lutilisateur

Ligne de commande

Graphique

17

18

Exemple: Jeu dchecs


Fonctionnalits:
o

Liaison entre ces 2 parties dune application ?

Jouer une partie


Dplacer des pices Grer les tours de jeu Joueur virtuel

o o

Enregistrer une partie Charger une partie tat de la partie en cours Parties sauvegardes Catalogues douvertures

Donnes:
o o o

?
19 20

Liaison entre ces 2 parties dune application ? Programmation en vrac et comme on peut

Liaison entre ces 2 parties dune application ? Programmation en vrac et comme on peut

21

22

Liaison entre ces 2 parties dune application ? programmation selon un modle organis.

Ce quil faut retenir


- Application interacti ve ?

- Lutilisateur le contr le - Dveloppement comp lexe

- Sparation Front Offic e/ Back Office

23

24

Plan du cours
1. Structure dune application interactive o Ce que lon !fait! et que lon !voit! o Ce quil se passe 2. Ralisation dapplications interactives: Modle-Vue-Contrleur (MVC) o Le modle o La vue o Le contrleur 3. Utilisation et ralisation de MVC o Analyse en terme de MVC o Ralisation en Java: 2 exemples pour dmarrer

Le modle Modle-Vue-Contrleur (MVC)


MVC est:
o

Un patron de conception (une solution standardise


un problme, indpendante des langages de programmation),

Une architecture logicielle (une manire de structurer une application ou un ensemble de logiciels).

Introduit en 1979 par Trygve Reenskaug, Trs fortement li aux concepts de la programmation objet (Smalltalk).

25

26

MVC: structure du modle


Organiser, structurer une application interactive en sparant:
o

Le modle Modle-VueContrleur (MVC)

Les donnes et leurs traitements: Le Modle La reprsentation des donnes


La Vue

MODELE

- fonctionnalits de lapplication - accs aux donnes et traitements

Le comportement de lapplication Le Contrleur

VUE

CONTROLEUR

- prsentation des donnes lutilisateur

- gestion des entres de lutilisateur - dfinit le comportement de lapplication

27

28

Le modle Modle-VueContrleur (MVC)

Le modle Modle-VueContrleur (MVC)

MODELE

- fonctionnalits de lapplication - accs aux donnes et traitements

MODELE

- fonctionnalits de lapplication - accs aux donnes et traitements

2-notification de changement dtat

1-entres utilisateur

1-entres utilisateur

VUE

CONTROLEUR

- prsentation des donnes lutilisateur

- gestion des entres de lutilisateur - dfinit le comportement de lapplication

VUE

CONTROLEUR

- prsentation des donnes lutilisateur

- gestion des entres de lutilisateur - dfinit le comportement de lapplication

29

30

Le modle Modle-VueContrleur (MVC)


3-oprations internes

Le modle Modle-VueContrleur (MVC)


3-oprations internes

MODELE

- fonctionnalits de lapplication - accs aux donnes et traitements

2-notification de changement dtat 4b-demande dtat

MODELE

- fonctionnalits de lapplication - accs aux donnes et traitements

2-notification de changement dtat

1-entres utilisateur

1-entres utilisateur

VUE

CONTROLEUR

- prsentation des donnes lutilisateur

- gestion des entres de lutilisateur - dfinit le comportement de lapplication

VUE
4c-mise jour
31

CONTROLEUR
4a-choix de la vue

- prsentation des donnes lutilisateur

- gestion des entres de lutilisateur - dfinit le comportement de lapplication

32

Le modle Modle-VueContrleur (MVC) Vision plus concrte

Le modle Modle-VueContrleur (MVC) Rfrences entre composants

MODELE
demande dtat

MODELE
notification de changement dtat

- fonctionnalits de lapplication - accs aux donnes et traitements

notification de changement

VUE
entres utilisateur

slection de la vue

CONTROLEUR

- prsentation des donnes lutilisateur

notification dentres

- gestion des entres de lutilisateur - dfinit le comportement de lapplication

VUE
MODELE
CONTROLEUR

CONTROLEUR
MODELE VUE

33

34

MVC: le modle
Le modle:
o o o o

MVC: la vue
La vue:
o o

Reprsente les donnes Fournit les accs aux donnes Fournit les traitements applicables aux donnes Expose les fonctionnalits de lapplication

Reprsente la (ou une) reprsentation des donnes du modle Assure la consistance entre la reprsentation quelle donne et ltat du modle/le contexte de lapplication

" Noyau Fonctionnel de lapplication

" Sorties de lapplication

35

36

MVC: le contrleur
Le contrleur:
o o o

Avantages de MVC
Structure propre de lapplication Indpendance donnes reprsentation comportements Adapt aux concepts de la programmation 0-0 Modulaire et rutilisable
o o o

Reprsente le comportement de lapplication face aux actions de lutilisateur Fournit la traduction des actions de lutilisateur en actions sur le modle Fournit la vue approprie par rapport aux actions de lutilisateur et des ractions du modle

"

Comportement et gestion des entres de lapplication

Vues interchangeables Contrleurs interchangeables Changement de Look & Feel Synchronisation quasi-implicite

Facilite les vues et contrleurs multiples


o

37

38

Inconvnients de MVC
Mise en place complexe dans le cas dapplications importantes Mises jour potentiellement trop nombreuses
o o

Ce quil faut retenir


- Structure modulaire de MVC - Rle des composants - Liens entre les composants

Spaghettis dans le code Temps dexcution

Contrleur et Vue restent souvent fortement lis au Modle " Adapter la ralisation au problme

39

40

Plan du cours
1. Structure dune application interactive o Ce que lon !fait! et que lon !voit! o Ce quil se passe 2. Ralisation dapplications interactives: Modle-Vue-Contrleur (MVC) o Le modle o La vue o Le contrleur 3. Utilisation et ralisation de MVC o Analyse en terme de MVC o Ralisation en Java: 2 exemples pour dmarrer

MVC: utilisation et ralisation


Comment raliser une application interactive selon le modle MVC ? Ce qui a dj t vu: le modle
o o

Implantation de modles Tests unitaires

41

42

Conventions de nommage
Paquetages:
o o o

Exemple 1: le thermomtre v1
Raliser une application interactive simulant un thermomtre, sur laquelle lutilisateur peut agir pour contrler la temprature Lapplication fournira:
o o o

Contrleurs: package application.controleurs; Vues: package application.vues; Modle: package application.modele;

Classes:
o o o

Contrleurs: ControleurNomClasse.java Vues: VueNomClasse.java Modle: ModeleNomClasse.java

Un affichage textuel de la temprature courante mesure par le thermomtre en C ou en K ou en F Des contrles permettant lutilisateur de diminuer et augmenter la temprature courante du thermomtre Un contrle permettant de choisir lunit daffichage de la temprature

43

44

Thermomtre v1
Affichage de la temprature Augmentation de la temprature Diminution de la temprature Choix de lunit de temprature

Thermomtre v1: analyse


Le modle (cf TP1b)
o

Donnes et traitements raliss:


Temprature courante Maintient de ltat de la temprature courante Conversions de la temprature en diffrentes units

Fonctionnalits exposes:
Augmenter la temprature de 1 (C ou K) Diminuer la temprature de 1 (C ou K) Donner la temprature en C, K ou F

45

46

Thermomtre v1: analyse


public void rechauffement(); public void refroidissement();

Thermomtre v1: analyse


La vue
o

ModeleThermometre.java

Affiche la temprature courante sous forme de texte Adapte son afchage lunit courante

" "

"

public double temperatureEnKelvin(); public double temperatureEnCelsius(); public double temperatureEnFarenheit();

47

48

Thermomtre v1: analyse


public void redessiner(); public void reglerUnite(Unite unite);

Thermomtre v1: analyse


Le contrleur
o o

VueThermometre.java

Fournit lutilisateur les contrles sur le modle: augmenter ou diminuer la temprature Traduit les actions de lutilisateur en opration sur le modle: dclenche les traitements par des appels de mthodes sur le modle Slectionne et mets jour la vue

49

50

Thermomtre v1: analyse

Thermomtre v1: analyse


ModeleThermometre.java

public double temperatureEnCelsius();

public void rechauffement();

ControleurThermometre.java
VueThermometre.java

public void redessiner();

ControleurThermometre.java

1 appui sur le bouton

51

52

Thermomtre v1: analyse


ModeleThermometre.java

Thermomtre v1: ralisation


Le modle (cf TP1b)
package thermometre.modele; public class ModeleThermometre { private double _temperature;//la temperature en Kelvin // (constructeurs) public double temperatureEnKelvin(){ return _temperature; } public double temperatureEnCelsius(){ return _temperature - 273.15; }

public double temperatureEnKelvin();

4
public void redessiner();
VueThermometre.java

public double temperatureEnFarenheit(){ return (9 / 5d) * _temperature - 459.67;

3
public void reglerUnite(K);

ControleurThermometre.java

} public void rechauffement(){ _temperature++; }

2 1 mvt sur le slider


}

public void refroidissement(){ if (_temperature > 1) { _temperature--; } }

53

54

Thermomtre v1: ralisation

Thermomtre v1: ralisation

La vue
package thermometre.vues; public class VueThermometre { private ModeleThermometre _modele;//le modle reprsenter private Unite _unite; //lunit daffichage courante public VueThermometre (ModeleThermometre modele){ _modele = modele; } public void reglerUnite (Unite unite){ _unite = unite; } //suite au prochain transparent...

La vue (suite)
public void redessiner (){ double tempCourante = 0; switch (_unite) { case CELSIUS: tempCourante = _modele.temperatureEnCelsius(); break; case FAHRENHEIT: tempCourante = _modele.temperatureEnFarenheit(); break; case KELVIN: tempCourante = _modele.temperatureEnKelvin(); } //oprations de dessin de la vue avec la valeur tempCourante //... } }

55

56

Thermomtre v1: ralisation


Le contrleur
package thermometre.controleurs; public class ControleurThermometre { private ModeleThermometre _modele;//le modle contrler private VueThermometre _vue;//la vue pour reprsenter le modle JButton _pButton = new JButton(">");//le bouton pour augmenter la temprature JButton _mButton = new JButton("<");//le bouton pour diminuer la temprature JSlider _mSlider = new JSlider(0, 20);//le slider pour choisir lunit public ControleurThermometre (ModeleThermometre modele, VueThermometre vue){ _modele = modele; _vue = vue; //placement des contrles de lIHM //... } //Suite au prochain transparent...

Thermomtre v1: ralisation


Le contrleur (suite)
//Lors dune action sur le bouton UP (les mcanismes dvnements seront dtaills plus tard dans ce cours) public void boutonUpActiv (){ _modele.rechauffement(); _vue.redessiner(); } //Lors dune action sur le bouton UP (les mcanismes dvnements seront dtaills plus tard dans ce cours) public void boutonDownActiv (){ _modele.refroidissement(); _vue.redessiner(); } //Lors dune action sur le bouton UP (les mcanismes dvnements seront dtaills plus tard dans ce cours) public void sliderActiv (){ _vue.reglerUnite(uniteDuSlider); _vue.redessiner(); } }

57

58

Thermomtre v1: ralisation


Lapplication
package thermometre; import java.awt.GridLayout; import javax.swing.JFrame; import thermometre.controleurs.ControleurThermometre; import thermometre.modele.ModeleThermometre; import thermometre.vues.VueThermometre; public class AppliThermometreSimple { public static void main(String[] args) { //Creation d'une fentre pour lapplication JFrame frame = new JFrame(); //Creation d'un modle de thermomtre ModeleThermometre modele = new ModeleThermometre(243.15); //Creation de la vue et du contrleur VueThermometre vue = new VueThermometre (modele); final ControleurThermometre pt1 = new ControleurThermometre(modele, vue); //Ajout des panneaux la fentre et affichage... //... } }

Commentaires sur cette ralisation de MVC ?


Validit par rapport au modle Problmes

?
59 60

Commentaires sur cette ralisation de MVC


Mcanismes de gestion des vnements => seront traits dans la suite du cours Modularit => Oui Indpendance Donnes-Vue-Interaction ? => Oui

Commentaires sur cette ralisation de MVC


Rutilisabilit et gnricit ?
o

Si lon veut utiliser un autre modle, une autre vue ou un autre contrleur ?

Par exemple, si lon veut maintenant:


o o o o o

Utiliser un autre modle de thermomtre avec cette vue et ce contrleur ? Utiliser une autre vue avec ce modle et ce contrleur ? Utiliser un autre contrleur avec ce modle et cette vue ? Utiliser une autre vue et un autre contrleur simultanment avec cette vue, ce modle et ce contrleur ? Etc.

61

62

Commentaires sur cette ralisation de MVC


Rutilisabilit et gnricit ? => Non!
o

Ralisation propre de MVC


Utiliser des Interfaces et des classes abstraites
o o

Si lon veut utiliser un autre modle, une autre vue ou un autre contrleur ?

Par exemple, si lon veut maintenant:


o o o o o

Utiliser un autre modle de thermomtre avec cette vue et ce contrleur ? Utiliser une autre vue avec ce modle et ce contrleur ? Utiliser un autre contrleur avec ce modle et cette vue ? Utiliser une autre vue et un autre contrleur simultanment avec cette vue, ce modle et ce contrleur ? (synchronisation) Etc.

Abstraction des implantations de chaque module Interfaces: contrats que doivent respecter les modules pour assurer leur interoprabilit

Remarque: Interface Utilisateur Interface en O-O-P

Impossible en ltat car les rfrences entre les objets de chaque module sont types par leur classe concrte. On doit modifier des parties du code de chaque module. " Valide par rapport au modle, mais nen nexploite pas le pouvoir
dabstraction (indpendance entre donnes/reprsentation/contrle)

63

64

Exemple 2: le thermomtre v2
Raliser une application interactive simulant 2 thermomtres sur lesquels lutilisateur peut agir pour contrler la temprature Lapplication fournira: o Un afchage de la temprature courante mesure par les thermomtre en C ou en K ou en F sous la forme:
Dun thermomtre mercure pour le 1er thermomtre Dun cadran aiguille pour le 2nd thermomtre
o

Thermomtre v2
Affichage de la temprature thermo 1 Affichage de la temprature thermo 2

Augmentation de la temprature thermo 1 Diminution de la temprature thermo 1

Augmentation de la temprature thermo 2

Des contrles permettant lutilisateur de diminuer et augmenter la temprature courante de chaque thermomtre Un contrle permettant de choisir lunit dafchage de la temprature pour chaque vue

Diminution de la temprature thermo 2 Choix de lunit de temprature thermo 2

Choix de lunit de temprature thermo 1

65

66

Thermomtre v2: analyse


Le modle
o

Thermomtre v2: analyse


Solutions pour la vue:
1.

Identique au prcdent Identique au prcdent MAIS doit oprer sur des vues potentiellement diffrentes Doit fournir diffrentes vue dun mme type de modle (mais pas forcment la mme instance)

Le contrleur
o o

La vue
o

Implanter des vues diffrentes dans la mme classe VueThermometre.java Solution lourde et peu flexible 2. Implanter des classes de vues diffrentes VueThermometreMercure.java et VueThermometreCompteur.java Il faut alors 2 contrleurs (lourd et peu flexible) 3. Fournir une interface VueThermometre.java spciant une vue de thrmomtre et spciant les prototypes de ces mthodes et limplanter selon les besoins Bonne solution

67

68

Thermomtre v2: analyse


Solutions pour la vue:
1.

Thermomtre v2: analyse


Solutions pour la vue:
1.

Implanter des vues diffrentes dans la mme classe VueThermometre.java Solution lourde et peu flexible 2. Implanter des classes de vues diffrentes VueThermometreMercure.java et VueThermometreCompteur.java Il faut alors 2 contrleurs (lourd et peu flexible) 3. Fournir une interface VueThermometre.java spciant une vue de thrmomtre et spciant les prototypes de ces mthodes et limplanter selon les besoins Bonne solution

Implanter des vues diffrentes dans la mme classe VueThermometre.java Solution lourde et peu flexible 2. Implanter des classes de vues diffrentes VueThermometreMercure.java et VueThermometreCompteur.java Il faut alors 2 contrleurs (lourd et peu flexible) 3. Fournir une interface VueThermometre.java spciant une vue de thermomtre et spciant les prototypes de ces mthodes et limplanter selon les besoins Bonne solution

69

70

Thermomtre v2: analyse


Tous les types de vues
o

Thermomtre v2: analyse


Methodes requises: public void redessiner(); public void reglerUnite(Unite unite);

Affichent la temprature courante sous une forme indtermine Adaptent leur afchage lunit courante

InterfaceVueThermometre.java (interface)

71

72

Thermomtre v2: analyse


InterfaceVueThermometre.java (interface)
public void redessiner();

Thermomtre v2: ralisation


Les vue(s)
package thermometre.vues; public interface InterfaceVueThermometre { //...

?
VueThermometreMercure.java
public void redessiner();

VueThermometreCompteur.java
public void redessiner();

/*** * Rgle l'unit d'affichage du thermometre. * * @param unite l'unit dsire. */ public void reglerUnite(Unite unite); /** * Methode pour notifier la vue de se redessiner */ public void redessiner(); }

73

74

Thermomtre v2: ralisation


La vue Mercure VueThermometreMercure.java
package thermometre.vues; public class VueThermometreMercure implements InterfaceVueThermometre { //... protected ModeleThermometre _modele = null; protected Unite _unite = Unite.CELSIUS;

Thermomtre v2: ralisation


La vue Compteur VueThermometreCompteur.java
package thermometre.vues; public class VueThermometreCompteur implements InterfaceVueThermometre { //... protected ModeleThermometre _modele = null; protected Unite _unite = Unite.CELSIUS;

public VueThermometreMercure(ModeleThermometre modele) { this._modele = modele; }

public VueThermometreCompteur(ModeleThermometre modele) { this._modele = modele; }

public void reglerUnite(Unite unite) { this._unite = unite; }

public void reglerUnite(Unite unite) { this._unite = unite; }

public void redessiner (){ double tempCourante = 0; switch (_unite) { case CELSIUS: tempCourante = _modele.temperatureEnCelsius(); break; case FAHRENHEIT: tempCourante = _modele.temperatureEnFarenheit(); break; case KELVIN: tempCourante = _modele.temperatureEnKelvin(); } //Oprations spcifiques de dessin de la vue Mercure... } }

public void redessiner (){ double tempCourante = 0; switch (_unite) { case CELSIUS: tempCourante = _modele.temperatureEnCelsius(); break; case FAHRENHEIT: tempCourante = _modele.temperatureEnFarenheit(); break; case KELVIN: tempCourante = _modele.temperatureEnKelvin(); } //Oprations spcifiques de dessin de la vue Compteur...

75

76

Thermomtre v2: ralisation


Le modle: identique au prcdent

Thermomtre v2: ralisation


Le contrleur
package thermometre.controleurs; public class ControleurThermometre { private ModeleThermometre _modele;//le modle contrler private InterfaceVueThermometre _vue;//la vue pour reprsenter le modle JButton _pButton = new JButton(">");//le bouton pour augmenter la temprature JButton _mButton = new JButton("<");//le bouton pour diminuer la temprature JSlider _mSlider = new JSlider(0, 20);//le slider pour choisir lunit public ControleurThermometre (ModeleThermometre modele, InterfaceVueThermometre vue){ _modele = modele; _vue = vue; //placement des contrles de lIHM //... } //Suite idem contrleur prcdent...

Le contrleur: identique au prcdent mais rfrence vers InterfaceVueThermometre

77

78

Thermomtre v2: ralisation


Lapplication
package thermometre; import java.awt.GridLayout; import javax.swing.JFrame; import thermometre.controleurs.ControleurThermometre; import thermometre.modele.ModeleThermometre; import thermometre.vues.*;

Commentaires sur cette ralisation de MVC ?


Validit par rapport au modle Problmes

public class AppliThermometreSimple {

public static void main(String[] args) { //Creation d'une fentre pour lapplication JFrame frame = new JFrame();

//Creation des modles de thermomtre ModeleThermometre modele1 = new ModeleThermometre(243.15); ModeleThermometre modele2 = new ModeleThermometre();

//Creation de la vue mercure et de son contrleur InterfaceVueThermometre vue1 = new VueThermometreMercure (modele1); ControleurThermometre pt1 = new ControleurThermometre(modele1, vue1);

?
79 80

//Creation de la vue compteur et de son contrleur InterfaceVueThermometre vue2 = new VueThermometreCompteur (modele2); ControleurThermometre pt2 = new ControleurThermometre(modele2, vue2);

//Ajout des panneaux la fentre et affichage... //... } }

Commentaires sur cette ralisation de MVC


Mcanismes de gestion des vnements => seront traits dans la suite du cours Mcanismes de dessin des vues => seront traits dans la suite du cours Modularit => Oui Indpendance Donnes-Vue-Interaction ? => Oui Code redondant dans les 2 types de vues => Utilisation dune classe abstraite intermdiaire.

Commentaires sur cette 2nde ralisation de MVC


Rutilisabilit et gnricit ? => Incomplte!
o

Si lon veut utiliser un autre modle ou un autre contrleur ?

Par exemple, si lon veut maintenant:


o o o o o

Utiliser un autre modle de thermomtre avec ce(s) vue(s) et ce contrleur ? Utiliser une autre vue avec ce modle et ce contrleur ? Utiliser un autre contrleur avec ce modle et ces vue ? Utiliser une autre vue et un autre contrleur simultanment avec cette vue, ce modle et ce contrleur ? (synchronisation) Etc.

Impossible en ltat car des rfrences entre des objets de chaque module sont types par leur classe concrte. On doit encore modifier des parties du code de chaque module. " Valide par rapport au modle, mais nen nexploite pas le pouvoir
dabstraction (indpendance entre donnes/reprsentation/contrle)

81

82

Ralisation de MVC
Principes des interfaces tendre la ralisation du modle et des contrleurs:
o

Exemple 3: le thermomtre MVC parfait


Raliser une application interactive simulant 2 thermomtres sur lesquels lutilisateur peut agir pour contrler la temprature Les thermomtres devront tre de 2 types: o Le thermomtre basique, prcis 1C prs o Le thermomtre spatial , prcis 0.0001C prs Lapplication fournira: o Un afchage de la temprature courante mesure par les thermomtre en C ou en K ou en F sous la forme:
Dun thermomtre mercure pour le 1er thermomtre Dun cadran aiguille pour le 2nd thermomtre
o o

Utiliser une interface InterfaceModeleThermometre.java (indpendance de la reprsentation et du contrle avec limplantation du modle) Idem pour le(s) contrleur(s) (souvent moins utile car le contrleur est relativement indpendant du modle et de la vue)

Chaque module rfrence les autres par leur type apparent (Interface) et les liens entre modules sont donc indpendants de leurs implantations

Des contrles permettant lutilisateur de diminuer et augmenter la temprature courante de chaque thermomtre Un contrle permettant de choisir lunit dafchage de la temprature pour chaque vue

83

84

Thermomtre MVC: analyse


Le modle (cf TP1b)
o

Thermomtre MVC: analyse


SPCIFICATION public void rechauffement(); public void refroidissement();
TEST UNITAIRE TestModeleThermometre.java

Donnes et traitements raliss:


Temprature courante Maintient de ltat de la temprature courante Conversions de la temprature en diffrentes units

Fonctionnalits exposes:
Augmenter la temprature de 1 (C ou K) Diminuer la temprature de 1 (C ou K) Donner la temprature en C, K ou F

InterfaceModeleThermometre.java (interface)

?
public double temperatureEnKelvin(); public double temperatureEnCelsius(); public double temperatureEnFarenheit();

85

86

Thermomtre MVC: analyse


InterfaceModeleThermometre.java
public void rechauffement(); public void refroidissement(); public double temperatureEnKelvin(); public double temperatureEnCelsius(); public double temperatureEnFarenheit();

Thermomtre MVC: analyse


Le contrleur: identique au prcdent mais rfrence vers InterfaceModeleThermometre

(interface)

ModeleThermometreBasique.java
public void rechauffement(); public void refroidissement(); public double temperatureEnKelvin(); public double temperatureEnCelsius(); public double temperatureEnFarenheit();

ModeleThermometreSpatial.java
public void rechauffement(); public void refroidissement(); public double temperatureEnKelvin(); public double temperatureEnCelsius(); public double temperatureEnFarenheit();

L(es) vue(s): identique(s) au(x) prcdente(s) mais rfrence vers InterfaceModeleThermometre

TestModeleThermometre.java

87

88

Thermomtre MVC: ralisation


Le modle
package thermometre.modele; public interface InterfaceModeleThermometre { /** * indique la temperature en Kelvin * @return la temperature en Kelvin courante que le thermomtre indique */ public double temperatureEnKelvin(); /** * indique la temperature en Celsius * @return la temperature en Celsius courante que le thermomtre indique */ public double temperatureEnCelsius(); /** * indique la temperature en Farenheit * @return la temperature en Farenheit courante que le thermomtre indique */ public double temperatureEnFarenheit(); /** * permet au capteur d'envoyer l'information d'un rechauffement ambiant d'un degr de la temprature * */ public void rechauffement(); /** * permet au capteur d'envoyer l'information d'un refroidissement ambiant d'un degr de la temprature * */ public void refroidissement(); }

Thermomtre MVC: ralisation


Le modle thermomtre basique
package thermometre.modele; public class ModeleThermometreBasique implements InterfaceModeleThermometre { final static protected double zeroAbsoluCelcius=-273.15; private double _temperature;//la temperature en Kelvin

/** * Construit un thermometre avec comme temperature initale O degre celcius */ public ModeleThermometreBasique(){ _temperature=0-zeroAbsoluCelcius; } public double temperatureEnKelvin(){ //oprations propres ce modle... } //Implantation des autres mthodes dfinies dans linterface... }

89

90

Thermomtre MVC: ralisation


Le modle thermomtre spatial
package thermometre.modele; public class ModeleThermometreSpatial implements InterfaceModeleThermometre { final static protected double zeroAbsoluCelcius=-273.15; private double _temperature;//la temperature en Kelvin

Thermomtre MVC: ralisation


Lapplication
package thermometre; import java.awt.GridLayout; import javax.swing.JFrame; import thermometre.controleurs.ControleurThermometre; import thermometre.modele.ModeleThermometre; import thermometre.vues.*;

public class AppliThermometreSimple {

public static void main(String[] args) { //Creation d'une fentre pour lapplication

/** * Construit un thermometre avec comme temperature initale O degre celcius */ public ModeleThermometreSpatial(){ _temperature=0-zeroAbsoluCelcius; } public double temperatureEnKelvin(){ //oprations propres ce modle... } //Implantation des autres mthodes dfinies dans linterface... }
91
}

JFrame frame = new JFrame();

//Creation des modles de thermomtre InterfaceModeleThermometre modele1 = new ModeleThermometreBasique(243.15); InterfaceModeleThermometre modele2 = new ModeleThermometreSpatial();

//Creation de la vue mercure et de son contrleur InterfaceVueThermometre vue1 = new VueThermometreMercure (modele1); ControleurThermometre pt1 = new ControleurThermometre(modele1, vue1);

//Creation de la vue compteur et de son contrleur InterfaceVueThermometre vue2 = new VueThermometreCompteur (modele2); ControleurThermometre pt2 = new ControleurThermometre(modele2, vue2);

//Ajout des panneaux la fentre et affichage... //... }

92

Thermomtre MVC: pour aller plus loin


Pour les vues:
o

Thermomtre v1: analyse (rappel)


ModeleThermometre.java

Permettre la vue dtre notie directement par le modle de ses mises jour (observateur)
Simplie la ralisation de MVC Rduit les messages et les rafchages Permet la synchronisation de plusieurs vues
4

public double temperatureEnCelsius();

public void rechauffement();

Dtails dimplantation dans la suite du cours (listeners)

VueThermometre.java

public void redessiner();

ControleurThermometre.java

1 appui sur le bouton

93

94

Thermomtre
ModeleThermometre.java

Ce quil faut retenir


- Importance de lanaly se du problme en !pens ant MVC! - Abstraire le schma de lapplication (interfaces et classes abstraites) -Indpendance des modules

Notification de changement

3
public double temperatureEnCelsius();

public void rechauffement();

VueThermometre.java

ControleurThermometre.java

1 appui sur le bouton

95

MVC: Conclusion et bilan


Un modle pour:
o o o

Analyser un !problme! Structurer une application interactive Implanter un systme de manire modulaire, exible et rutilisable Lindpendance front-office (IHM) back-office (donnes et traitements) La maintenance et la rutilisation de modules

Garantit et facilite:
o

Mais ce nest pas une solution universelle...

Vous aimerez peut-être aussi