La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 Cours JAVA / Y.Laborde Java : Modèle / Vues / Contrôleurs LES CONCEPTS du paradigme MVC : Introduction Limplémentation MVC dans Java le package java.util.

Présentations similaires


Présentation au sujet: "1 Cours JAVA / Y.Laborde Java : Modèle / Vues / Contrôleurs LES CONCEPTS du paradigme MVC : Introduction Limplémentation MVC dans Java le package java.util."— Transcription de la présentation:

1 1 Cours JAVA / Y.Laborde Java : Modèle / Vues / Contrôleurs LES CONCEPTS du paradigme MVC : Introduction Limplémentation MVC dans Java le package java.util la classe java.util.Observable linterface java.util.Observer La méthode notifyObservers(Object arg) nécessité de largument non nul une classe de messages : WhatChanged La technique du modèle interfacé en strates dérivations successives du modèle (strates) interfaçage par strates du modèle (diapo 6) (6) (7) (8) (9) (10) (14) (15)

2 2 Cours JAVA / Y.Laborde Java : MVC / Exemple de base Exemple dune calculatrice simple. Cette calculatrice contient différentes fonctionnalités qui peuvent être regroupées par catégories : lafficheur du résultat les boutons de commandes ( Retour arrière, CE, C ) les boutons de mémoires ( MC, MR, MS, M+ ) la zone dindication de présence dune donnée en mémoire les boutons numériques ( 0 à 9, +/-,. ) les boutons dopérations binaires ( /, *, -, + ) les boutons dopérations unaires ( Rac, %, 1/x, = )

3 3 Cours JAVA / Y.Laborde Java : MVC / Introduction Le paradigme MVC (Modèle / Vues / Contrôleurs) est conçu pour les applications possédant une forte interactivité avec lutilisateur. De fait, il est parfaitement adapté aux applicatifs dotées dune IHM. Cest une technique de programmation basée sur le développement modulaire. En effet, toute application interactive peut a priori être découpée en 3 parties : - le modèle (éventuellement architecturé en modèle principal et modèles secondaires) - les vues - les contrôleurs Quel est le rôle du modèle ? Son rôle est de conserver létat des données spécifiques à lapplicatif et de réaliser les traitements algorithmiques afférents. Exemple de la calculatrice : Cest tout ce qui réalise les opérations mathématiques, les conversions, la mise en mémoire de valeurs, la vérification du parenthésage, … Quel sont les rôles des vues ? Leur rôle est de maintenir à jour, en totalité ou en partie, une représentation (graphique) de létat courant du modèle et de fournir linteractivité nécessaire. Exemple de la calculatrice : Ce sont tous les composants graphiques comme lafficheur du résultat, lafficheur de présence dune valeur mémorisée, lactivation ou non dune commande, … ainsi que la Frame, les boutons, … Quel sont les rôles des contrôleurs ? Leur rôle est de définir le comportement des vues vis-à-vis des interactions (clavier, souris, …) et de les acheminer sous forme dévénements aux vues. Exemple de la calculatrice : Ce sont tous les Listener mis en place : ActionListener, TextListener, WindowListener, …

4 4 Cours JAVA / Y.Laborde Java : MVC / Introduction Le concept de modularité sous-jacent à la technique MVC oblige à ce que les modules communiquent entre eux. Mise à part linitialisation des liens à linstanciation des modules, les communications entre modules peuvent être de plusieurs types : modèle vers vuesvues vers modèlecontrôleur vers vues Modèle ModèleDeCalc ulatrice AfficheurRésultat Contrôleur Contrôleurs BoutonsOpération sBinairesContrôle ur … AfficheurRésultat Vues Bouton « + » Bouton « = » … AfficheurRésultat Adapteur BoutonsOpération sBinairesAdapteur … ComposantsEcouteurs click JVM (WM) (1) (1) JVM (WM) : la JVM prévient le contrôleur Java en encapsulant un événement approprié 1C => 1V (2) (2) 1C => 1V : le contrôleur Java achemine le message vers ladaptateur de vue intéressée 1V => M (3) (3) 1V => M : ladaptateur de la vue prévient le modèle de linteraction utilisateur M => *V (4) (4) M => *V : le modèle CHANGE SON ETAT INTERNE puis fait la demande à CHAQUE VUE (inscrite) de se mettre à jour pour refléter ce nouvel état. Ici, cest principalement AfficheurRésultat qui devra modifier la valeur affichée.

5 5 Cours JAVA / Y.Laborde Java : MVC / Introduction Ainsi avec le paradigme MVC : - chaque contrôleur communique avec une vue - chaque vue communique avec un modèle (et éventuellement avec des sous-modèles) mais - le modèle communique toujours avec de nombreuses vues sans véritablement les distinguer les unes des autres. Il ne fait que les informer que son état a changé. Aux vues de se mettre à jour pour représenter correctement le nouvel état du modèle. Cela est dû à la fonction même du modèle : * protéger les données propres à lapplicatif en les encapsulant, * faire évoluer les données (sans risquer leur incohérence) à laide dalgo- rithmes internes « parfaitement sûrs », * informer les vues de tout changement détat, * fournir des méthodes « sûres » permettant aux vues de connaître létat du modèle. Il en découle tous les avantages de la modularité (réutilisabilité, maintenance aisée, développement en équipe, application à de grands projets, …).

6 6 Cours JAVA / Y.Laborde Java : MVC / le package java.util Limplémentation MVC de Java consiste à fournir DEUX entités toutes les deux implémentées dans le package « java.util ». Observable Observer Les entités MVC de Java public classe Object public interface Le MODELE doit dériver cette classe pour devenir OBSERVABLE par des VUES Les VUES doivent implémenter cette interface pour devenir OBSERVATRICES de MODELES public ModèleDeCalculatrice extends java.util.Observable public BoutonsOpérationsBinairesPanel extends java.awt.Panel implements java.util.Observer, java.awt.event.ActionListener public AfficheurRésultat extends java.awt.TextField implements java.util.Observer, java.awt.event.TextListener Les CONTRÔLEURS sont « transparents » en Java. Ils sont en grande partie implémentés par la JVM.

7 7 Cours JAVA / Y.Laborde Java : MVC / la classe java.util.Observable public class java.util.Observable extends Object Cette classe représente un modèle Observable. Elle doit être dérivée pour obtenir un modèle applicatif. Un modèle peut avoir un ou plusieurs « observateurs ». Ceux-ci devront sinscrire auprès du modèle observable pour que celui-ci puisse leur envoyer les messages de mise à jour à chaque changement de son état. Pour cela, après quun Observable change détat, il doit invoquer SetChanged() puis notifyObservers(…) pour que tous ses Observer soit notifiés du changement par lappel de leur méthode update(…). Lordre dans lequel les Observer sont notifiés ne fait lobjet daucune spécification. ObjectObservable CONSTRUCTEURS : public Observable () METHODES : public void addObserver (Observer o)=> pour inscrire un Observer (une vue) protected void setChanged ( )=> sans appel de cette méthode, les 2 suivantes ne font rien ! public void notifyObservers ( )=> si le flag de changement est positionné, notifie TOUS les public void notifyObservers (Object arg)Observer inscrits (avec largument vide ou non) public boolean hasChanged ( )=> indique létat du flag de changement du modèle

8 8 Cours JAVA / Y.Laborde Java : MVC / linterface java.util.Observer public interface java.util.Observer Une classe peut implémenter cette interface lorsquelle veut être informée des changements dun objet Observable (i.e. un modèle). Ce dernier invoquera la méthode update(…) de lObserver à chaque fois que son état interne aura changé. Observer METHODES : public void update (Observable o, Object arg) Observable o, le modèle qui a envoyé ce message. Cela permet de retrouver le modèle dont létat a changé de sorte à le questionner pour connaître son état. Ce paramètre peut faire lobjet dun cast en cas de certitude sur la classe du modèle. Object arg, un paramètre objet fournit par le modèle ( méthode notifyObservers(Object arg) ) pour renseigner sur la nature du changement. Lorsque la notification par le modèle est effectuée par appel de la méthode notifyObservers() sans paramètre, cela invoque notifyObservers(null). La méthode update(Object arg) reçoit alors une référence nulle dans arg.

9 9 Cours JAVA / Y.Laborde Java : MVC / la méthode notifyObservers(Object arg) Nécessité de largument non nul Cette méthode peut être utilisée lorsque lon désire fournir des renseignements aux vues sur la nature du changement produit dans le modèle. En effet, dans le cas dun applicatif possédant un état tel que des changements peuvent intervenir dans certaines parties et pas dans dautres. exemple: la calculatrice montre à la fois le résultat du calcul et lindicateur de présence dune valeur en mémoire ; or parfois le modèle changera à cause dun nouveau résultat à afficher et parfois à cause dune modification de lindicateur de mémoire. Si le modèle envoie un message notifyObservers() sans argument, chaque vue recevant ce message est invitée à rafraîchir sa représentation sans savoir si la partie de modèle quelle représente a véritablement changée ou non. Or, en général, le modèle nest pas en mesure, après coup, dinformer les vues sur laspect qui vient de changer. Ainsi, certaines vues vont devoir se rafraîchir alors quelles nen auraient pas besoin !

10 10 Cours JAVA / Y.Laborde Java : MVC / une classe de messages : WhatChanged Une méthode correcte consiste à construire une classe WhatChanged : -contenant des messages prédéfinis -et capable daccepter tous types dobjets permettant de préciser les changements intervenus dans le modèle. class WhatChanged { // messages indiquant la nature du changement static public String WC_RESULTAT = WC_RESULTAT; static public String WC_IND_MEM = WC_IND_MEM;... // Variables dinstance public String mess; public Object 01,02; // 03,04,… si nécessaire ! // Constructeurs utiles public WhatChanged(String _mess) { this.mess = _mess; } // O1 et 02 sont nuls public WhatChanged(String _mess, Object _01) { this.mess = _mess; this.O1 = _O1; } // 02 est nul public WhatChanged(String _mess, Object _01,Object _02) { this.mess = _mess; this.O1 = _O1; this.O2 = _O2; } } Ici, les deux messages définis correspondent à un changement du résultat (WC_RESULTAT) et à un changement de lindicateur de valeur en mémoire (WC_IND_MEM). Dautres messages peuvent être ajoutés. Ici, deux objets O1 et O2 permettent au modèle de transmettre des informations complexes aux vues. Mais ces dernières doivent connaître le type dobjets effectivement transmis pour pouvoir effectuer un cast et retrouver leur contenu.

11 11 Cours JAVA / Y.Laborde Java : MVC / exemple dutilisation de WhatChanged class ModèleDeCalculatrice extends java.util.Observable { // Variables dinstance du modèle protected double result, oldResult; protected char oldOperator; protected double memoryValue; protected boolean oldResultOK, oldOperatorOK, memoryValueOK; public ModèleDeCalculatrice () { this.oldResultOK = this.oldOperatorOK = this.memoryValueOK = false; } public doBinaryOperation(char op) { if (op=== && oldResultOK && oldOperatorOK) { if (oldOperator == + ) { oldResult = result = oldResult + result ; this.notifyAll( // Construit largument : new WhatChanged ( WhatChanged.WC_RESULTAT, (new Double(result)).toString() ) ); } else if (oldOperator == - )... } else if (op == +)... } protected notifyAll(Object arg) { this.SetChanged(); this.notifyObservers(arg); } } class WhatChanged {... } class AfficheurRésultat extends java.awt.TextField implements java.util.Observer, java.awt.event.TextListener {... public AfficheurRésultat ( Observable o) { o.addObserver(this); //inscription } public void update (Observable o, Object arg) { // Réception dun chgt du modèle WhatChanged wc; if (arg instanceof WhatChanged ){ wc = (WhatChanged)arg; if ( wc.mess.equals (WhatChanged.WC_RESULTAT) ) // Modifier laffichage this.setText((String)wc.01); }

12 12 Cours JAVA / Y.Laborde Java : MVC / Exercices Exercices: 1) en supposant que la classe ci-dessous existe, analysez comment vous pourriez gérer lensemble des boutons et de lindicateur de mémoire à laide du modèle. public class MemoryPanel extends java.awt.Panel implements java.util.Observer, java.awt.event.ActionListener 2) écrire le code correspondant

13 13 Cours JAVA / Y.Laborde Java : MVC / La technique du modèle interfacé en strates Limportance des modèles La construction dun modèle est une opération des plus importantes dans les applicatifs dentreprise (importance stratégique, maintenance, développement en équipes, grande taille, …) car, en définissant les données et les algorithmes propres à lapplicatif, il renferme le cœur de lapplication. Au delà, les vues doivent être également soignées mais elles sont souvent sujettes à transformations. Il est donc important de prévoir dès le départ de lanalyse une base solide permettant facilement de faire évoluer lapplicatif. Cette base doit elle-même sappuyer sur un paradigme fort tel que celui du MVC. Or, dans cette technique modulaire de programmation, la base sur laquelle repose lensemble du développement nest autre que le modèle. Cest pour cela que, dans les développements MVC, les modèles doivent correspondre aux premières préoccupations de lanalyse-conception.

14 14 Cours JAVA / Y.Laborde Java : MVC / Exercice Exercice: 1) Reprenez lanalyse complète de la calculatrice en commençant par lanalyse du modèle (vous mettrez en évidence les différentes strates et interfaces du modèle). 2) Écrivez le code correspondant.


Télécharger ppt "1 Cours JAVA / Y.Laborde Java : Modèle / Vues / Contrôleurs LES CONCEPTS du paradigme MVC : Introduction Limplémentation MVC dans Java le package java.util."

Présentations similaires


Annonces Google