poo / ihm architecture .poo / ihm architecture logicielle anne-marie dery (pinna@ )

Download POO / IHM Architecture .POO / IHM Architecture Logicielle Anne-Marie Dery (pinna@ )

Post on 14-Sep-2018

217 views

Category:

Documents

3 download

Embed Size (px)

TRANSCRIPT

  • POO / IHM Architecture Logicielle

    Anne-Marie Dery (pinna@polytech.unice.fr)

    Audrey Occello (occello@polytech.unice.fr)

    mailto:pinna@polytech.unice.frmailto:occello@polytech.unice.fr

  • Exemple MVC pour un diteur simple

    1. coute de lvnement systme li

    ldition dun des 5 paramtres

    2. appel dune des 5

    mthodes du contrleur

    avec la donne modifier

    3. dlgation au

    modle

    0.

    initialisation

    de la vue

    avec les

    donnes du

    modle

    4. coute des

    changements

    dtats du

    modle

  • Synchronisation entre la vue

    et le modle

    Se fait par lutilisation du pattern Observer.

    Permet de gnrer des vnements lors dune

    modification du modle et dindiquer la vue

    quil faut se mettre jour

    Observable = le modle

    Observers = les vues

    3

  • Observer Observable

  • Besoin dvnements

    Le pattern Observer dcrit

    comment tablir les relations entre les objets dpendants.

    Les objets-cls sont

    la source

    Peut avoir nimporte quel nombre dobservateurs dpendants

    Tous les observateurs sont informs lorsque ltat de la source change

    lobservateur.

    Chaque observateur demande la source son tat afin de se synchroniser

  • Structure

  • Collaborations

    aSubjectImpl : SubjectImpl

    aObserverImpl : ObserverImpl

    anotherObserverImpl : ObserverImpl

    aClient

    2: notifyObservers

    1: setState

    3: update

    4: getState

    5: update

    6: getState

  • Bnfices

    Utilisation indpendante des sources et des observateurs.

    On peut rutiliser les sources sans rutiliser les observateurs et vice-versa.

    On peut ajouter des observateurs sans modifier la source et les autres observateurs.

    Support pour la communication broadcast

    La source ne se proccupe pas du nombre dobservateurs.

  • Implmentations Java du pattern

    Une classe et une interface : class Observable {... } et

    interface Observer

    Un objet Observable doit tre une instance de la classe qui drive de la classe Observable

    Un objet observer doit tre instance dune classe qui implmente linterface Observer

    void update(Observable o, Object arg);

    Des listeners : ajouter des listerners, notifier les listeners avec des vnements, ragir aux vnements

  • Exemple de Listener

    jan.newmarch.name/java/replayJava/paper.htm

    http://jan.newmarch.name/java/replayJava/paper.html

  • Exemple de Listener

    jan.newmarch.name/java/replayJava/paper.htm

    http://jan.newmarch.name/java/replayJava/paper.html

  • Listeners Supported by Swing Components

    http://java.sun.com/docs/books/tutorial/uiswing/events/intro.html

    http://java.sun.com/docs/books/tutorial/uiswing/events/intro.htmlhttp://java.sun.com/docs/books/tutorial/uiswing/events/intro.html

  • Le modle : la base

    14

    public class VolumeModel { private int volume; public VolumeModel(){ super(); volume = 0; } public int getVolume() { return volume; } public void setVolume(int volume) { this.volume = volume; } }

  • Pour la notification

    Pour permettre la notification de changement

    de volume, on utilise des listeners

    On cre donc un nouveau listener

    (VolumeListener) et un nouvel vnement

    (VolumeChangeEvent)

    15

  • Le listener et levent

    16

    import java.util.EventListener;

    public interface VolumeListener extends EventListener {

    public void volumeChanged(VolumeChangedEvent event);

    }

    import java.util.EventObject;

    public class VolumeChangedEvent extends EventObject{

    private int newVolume;

    public VolumeChangedEvent(Object source, int newVolume){

    super(source);

    this.newVolume = newVolume;

    }

    public int getNewVolume(){

    return newVolume;

    }

    }

  • Implmentation du systme dcouteurs dans le modle (1/2)

    17

    import javax.swing.event.EventListenerList; public class VolumeModel { private int volume; private EventListenerList listeners; public VolumeModel(){ this(0); } public VolumeModel(int volume){ super(); this.volume = volume; listeners = new EventListenerList(); } public int getVolume() { return volume; } public void setVolume(int volume) { this.volume = volume; fireVolumeChanged(); }

  • Implmentation du systme dcouteurs dans le modle (2/2)

    18

    public void addVolumeListener(VolumeListener listener){

    listeners.add(VolumeListener.class, listener);

    }

    public void removeVolumeListener(VolumeListener l){

    listeners.remove(VolumeListener.class, l);

    }

    public void fireVolumeChanged(){

    VolumeListener[] listenerList = (VolumeListener[])

    listeners.getListeners(VolumeListener.class);

    for(VolumeListener listener : listenerList){

    listener.volumeChanged(

    new VolumeChangedEvent(this, getVolume()));

    }

    }

    }

  • Ce que lon a maintenant

    Le modle est maintenant capable davertir tous ses couteurs chaque changement de volume

    En fonction de lapplication, il est possible dimaginer plusieurs listeners par modles et dautres vnements dans les listeners (par exemple quand le volume dpasse certains seuils)

    Remarque : le modle peut devenir trs vite consquent

    19

  • Pr-requis pour le contrleur

    Pour viter dtre dpendant de Swing, on va crer

    une classe abstraite reprsentant une vue de

    volume

    20

    public abstract class VolumeView implements VolumeListener{

    private VolumeController controller = null;

    public VolumeView(VolumeController controller){

    super();

    this.controller = controller;

    }

    public final VolumeController getController(){

    return controller;

    }

    public abstract void display();

    public abstract void close();

    }

  • Le Contrleur

    Manipulera des objets de type View et non plus de type Swing

    Un seul contrleur sera cr dans un soucis de simplicit puisque les 3 vues font la mme chose.

    Dans le cas de vues compltement diffrentes, il est fortement conseill dutiliser plusieurs contrleurs

    21

  • Les vues

    Nous supposons 3 vues (dans le cadre du cours, nous nen montrerons qu une) :

    Une vue permettant de modifier le volume avec un champ de texte et valider par un bouton

    Une vue permettant de modifier le volume laide dune jauge + bouton pour valider

    Une vue listant les diffrents volumes

    Toutes ces vues sont reprsentes par une JFrame

    22

  • Contrleur (1/2)

    23

    public class VolumeController {

    public VolumeView fieldView = null;

    public VolumeView spinnerView = null;

    public VolumeView listView = null;

    private VolumeModel model = null;

    public VolumeController (VolumeModel model){

    this.model = model;

    fieldView = new JFrameFieldVolume(this, model.getVolume());

    spinnerView = new JFrameSpinnerVolume(this, model.getVolume());

    listView = new JFrameListVolume(this, model.getVolume());

    addListenersToModel();

    }

    private void addListenersToModel() {

    model.addVolumeListener(fieldView);

    model.addVolumeListener(spinnerView);

    model.addVolumeListener(listView);

    }

  • Contrleur (2/2)

    24

    public void displayViews(){

    fieldView.display();

    spinnerView.display();

    listView.display();

    }

    public void closeViews(){

    fieldView.close();

    spinnerView.close();

    listView.close();

    }

    public void notifyVolumeChanged(int volume){

    model.setVolume(volume);

    }

    }

  • Les vues

    Nous allons faire 3 vues (dans le cadre du cours, nous nen montrerons qu une) :

    Une vue permettant de modifier le volume avec un champ de texte et valider par un bouton

    Une vue permettant de modifier le volume laide dune jauge + bouton pour valider

    Une vue listant les diffrents volume

    Toutes ces vues sont reprsentes par une JFrame

    25

  • JFrameField (1/3)

    26

    import java.awt.event.ActionEvent;

    import java.awt.event.ActionListener;

    import java.text.NumberFormat;

    import javax.swing.*;

    import javax.swing.text.DefaultFormatter;

    public class JFrameFieldVolume extends VolumeView

    implements ActionListener{

    private JFrame frame = null;

    private JPanel contentPane = null;

    private JFormattedTextField field = null;

    private JButton button = null;

    private NumberFormat format = null;

    public JFrameFieldVolume(VolumeController controller) {

    this(controller, 0);

    }

    public JFrameFieldVolume(VolumeController controller, int volume){

    super(controller);

    buildFr