IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Design Patterns Discussion :

MVC et update(Observable S, Object o)


Sujet :

Design Patterns

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 46
    Par défaut MVC et update(Observable S, Object o)
    Bonjour à tous!

    voila mon soucis: je dois concevoir une application ("jtunes") qui est un lecteur de musique mp3
    voila à quoi ressemble l'appli (tout n'est pas implémenté) :

    mini legende:
    1 -> Jlist qui liste les fichiers au format mp3 du fichier séléctionné
    2 -> JTable qui listera la playlist actuelle
    3 -> les boutons de lecture etc...

    mon appli respecte donc le pattern MVC (enfin j'essai)

    pour résumer j'ai donc:
    - une vue (PlayerView.java que vous voyez)
    - un controller
    - un modele

    le modele contient TOUTES les données necessaires au fonctionnement de l'appli dans un seul fichier model.java.

    Mon probleme c'est que lorsque le modele change d'etat et notifie les observateurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    setChanged();
    notifyObservers(o);
    clearChanged();
    ma vue va appeler la methode update() ce qui aura pour effet de mettre à jours TOUS les JComponents.

    vous vous en doutez je voudrais éviter cela et pouvoir ne mettre a jour que ce qui est necessaire.

    - j'avais comme 1ere solution de rajouter à toutes les methodes un argument Object arg qui serait le JComponent responsable de l'appel mais j'ai l'impression que ce serait du "bidouillage"

    - en 2 je voulais créer 3 modeles différents (et donc 3 controllers) mais je me dis que le pattern observer étant une relation d'un modele à plusieurs vues, cela reviendrait à faire exactement l'inverse...


    Pourriez vous me donner la meilleure solution pour avoir une MAJ efficace?
    je pense que le probleme est simple a resoudre mais jusque la le modele de mes applis etait plus simple et je n'avait pas encore été confronté à ce soucis...

    Merci d'avance pour vos réponses

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Tes 2 solutions me semblent bien avec une préférence pour la seconde solution parce que la contrainte un modèle plusieurs vues je ne sais pas d'où tu sors cela surtout si chaque vue à une fonction différente tu vas forcément avoir un modèle différent.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 46
    Par défaut
    J'avoue qu'entre les deux la solution 2 me semblait la meilleure mais il se pose d'autres soucis si je procede ainsi:

    - chaque vue n'ayant qu'un unique controller, il faudrait dans ce cas que je "split" ma classe ViewPlayer.java en 3 vues distinctes pour les reunir ensuite dans une JFrame...a la limite pourquoi pas encore que ca ne me semble pas des masses logique.

    - de plus, et c'est ce qui me gene le plus:
    3 modeles différents me gênent un peu car ils devront interagir... du coup je ne vois pas la raison de les séparer...

    je veux dire si je fais:
    -model1 : s'occupe des données de la liste de recherche dynamique(accés en BDD(sqlite) etc)
    -model2 : s'occupe des ajouts de morceaux et donc de la playList (JTable)
    - model3 : s'occupe de tout ce qui a atrait à la lecture

    dans ce cas le model2 devra faire appel aux données du 1 pour rajouter un certain morceau

    et le 3 faire appel à celles du 2 pour lancer le bon morceau suivant la playlist...

    du coup un tel decoupage ne me semble pas logique!

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par joejoe1 Voir le message
    - chaque vue n'ayant qu'un unique controller,
    Non tu peux avoir un contrôleur pour ta vue mais avec 3 abonnements d'observateurs.

    Ton problème c'est que tu donnes la responsabilité à la vue de dire quoi mettre à jour alors qu'elle ne devrait s'occuper que de la mise à jour. Ce que je veux dire c'est que c'est au contrôleur d'appeler la bonne méthode d'update en fonction de ce qui a changé dans le modèle.

    Dans le notifyobserver tu devrais faire par exemple :

    S'il y a un ajout de morceau alors ton contrôleur devrait faire

    ViewPlayer.UpdatePlayList();

    S'il s'agit d'une mise à jour de la lecture alors ton contrôleur devrait faire

    ViewPlayer.UpdatePlayInProgress();


    - de plus, et c'est ce qui me gene le plus:
    3 modeles différents me gênent un peu car ils devront interagir... du coup je ne vois pas la raison de les séparer...

    je veux dire si je fais:
    -model1 : s'occupe des données de la liste de recherche dynamique(accés en BDD(sqlite) etc)
    -model2 : s'occupe des ajouts de morceaux et donc de la playList (JTable)
    - model3 : s'occupe de tout ce qui a atrait à la lecture

    dans ce cas le model2 devra faire appel aux données du 1 pour rajouter un certain morceau

    et le 3 faire appel à celles du 2 pour lancer le bon morceau suivant la playlist...

    du coup un tel decoupage ne me semble pas logique!
    En principe tu devrais avoir 1 fichier ou 1 classe par modèle. Et qu'il y ait des dépendances dans le package modèle est tout à faire normal et logique.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 46
    Par défaut
    En principe tu devrais avoir 1 fichier ou 1 classe par modèle. Et qu'il y ait des dépendances dans le package modèle est tout à faire normal et logique.
    c'est justement ma question^^
    en fait pour le moment toutes les données sont regroupées dans le meme fichier JtunesModel.java .
    il faudrait donc que je separe mes données en 3 modeles differents?

    Non tu peux avoir un contrôleur pour ta vue mais avec 3 abonnements d'observateurs.
    jaime assez cette idée! j'aurais donc
    1 seule vue
    1 seul controller
    3 modeles

    c'est bien ca?

    Dans le notifyobserver tu devrais faire par exemple :
    S'il y a un ajout de morceau alors ton contrôleur devrait faire
    ViewPlayer.UpdatePlayList();
    ici par contre je ne comprend pas bien ou tu veux en venir, la notifications des observers se fait bien dans le model avec setChanged() + notifyObservers() non?

    parcequ'en réalité tout le problème se situe la:
    pour le moment,mon modele possède les données concernant la Jlist de recherche(numero1 du graphique) de la JTable playlist(numero2) et du lecteur a proprement parler(numero3)

    et quand le modele fait appel a setChanged() + notifyObservers() il envoi a ma vue un unique signal pour dire que son état a changé mais sans preciser quelle partie...et c'est le drame

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par joejoe1 Voir le message
    c'est justement ma question^^
    en fait pour le moment toutes les données sont regroupées dans le meme fichier JtunesModel.java .
    il faudrait donc que je separe mes données en 3 modeles differents?
    Clairement oui.

    Citation Envoyé par joejoe1 Voir le message
    jaime assez cette idée! j'aurais donc
    1 seule vue
    1 seul controller
    3 modeles

    c'est bien ca?
    Oui quoique tu peux aussi découper en 3 vues cela peut être utile dans une optique de ré utilisabilité.


    Citation Envoyé par joejoe1 Voir le message
    ici par contre je ne comprend pas bien ou tu veux en venir, la notifications des observers se fait bien dans le model avec setChanged() + notifyObservers() non?

    parcequ'en réalité tout le problème se situe la:
    pour le moment,mon modele possède les données concernant la Jlist de recherche(numero1 du graphique) de la JTable playlist(numero2) et du lecteur a proprement parler(numero3)

    et quand le modele fait appel a setChanged() + notifyObservers() il envoi a ma vue un unique signal pour dire que son état a changé mais sans preciser quelle partie...et c'est le drame

    La question est justement qu'est-ce que tu fais dans ton NotifyObserver ? Tu es sensé appeler une méthode de l'observateur non ?

    Et ton idée de passer des arguments aussi est correcte, en gros voilà à quoi je pense niveau code à toi de l'adapter en ajoutant les autres abonnements avec les paramètres dont tu as besoin, c'est juste pour que tu comprends mon idée


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    interface IViewPlayer
    {
       public void UpdatePlayList(List<string> NewPlayList);
    }
    
    class ControllerViewPlayer
    {
       IViewPlayer ViewPlayer;
       List<IViewPlayer> observersPlayList = new List<IViewPlayer>();
    
       public ControllerViewPlayer(IViewPlayer player) { ViewPlayer = player; }
       
       public void AddObserverPlayList(IViewPlayer observer)
     { 
        observersPlayList.Add(observer);
    }
       
      private void NotifyPlayList(Modele model)
      {
          foreach(IViewPlayer player in observersPlayList)
    {
          player.UpdatePlayList(model.GetPlayList());
    }
    
       }
       public void AddPlayList(string Repertoire)
    {
        //instanciation du modèle etc....
        NotifyPlayList( new Model(Repertoire));    
    }
    }
    
    class ViewPlayer : IViewPlayer
    {
       ControllerViewPlayer _Controller;
       public ViewPlayer()
       {
           _Controller = new ControllerViewPlayer(this);
           _Controller.AddObserverPlayList(this);
        }
    
     public void UpdatePlayList(List<string> NewPlayList) 
    { 
        //mise à jour du composant graphique de la playlist}
    }
    
    public void ClicAddPlayList()
    {
       _Controller.AddPlayList(NomRepertoire);
    }

Discussions similaires

  1. [FB4] Problème insert, delete, update avec Remote Object
    Par gui-yem dans le forum Flex
    Réponses: 16
    Dernier message: 11/04/2011, 21h59
  2. MVC avec NetBeans : Observer ou ActionListener
    Par L0007 dans le forum NetBeans
    Réponses: 2
    Dernier message: 08/04/2008, 11h02
  3. [Java] [MVC] Objet Observable et héritage
    Par loicdvi dans le forum MVC
    Réponses: 6
    Dernier message: 06/10/2006, 11h31
  4. MVC et Observer
    Par oxor3 dans le forum CORBA
    Réponses: 6
    Dernier message: 16/06/2005, 21h58
  5. Réponses: 8
    Dernier message: 21/11/2003, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo