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

  1. #1
    Membre du Club
    Inscrit en
    mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 187
    Points : 51
    Points
    51
    Par défaut [MVC Java] Problème d'implémentation MVC
    Bonjour,
    Je réalise un petit projet que je vous explique de façon très simplifiée :

    Mon modèle doit représenter 4 affiches qui sont allumées à des moments différents. Comme attributs du modèle j'ai donc 4 booléens qui indiquent si l'affiche est allumée ou pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    boolean afficheA;
    boolean afficheB;
    boolean afficheC;
    boolean afficheD;
    Je pensais donc créer simplement une classe Affiches qui serait le modèle dans laquelle j'aurais les 4 attributs + une ArrayList<AfficheVue>. Il y aurait en plus une méthode notifyChange() qui notifie les vues lorsque le modèle est modifié et une méthode qui gère les changement de valeurs des 4 attributs (par Timer).
    Chaque affiche a ses propres vues et la valeur d'un seul des attributs change a la fois.

    Mes questions sont deux :

    1/ Pouvez-vous m'aider pour faire changer les valeurs des 4 attributs au fur et à mesure de l'avancement du temps. Comment faire par exemple pour le cycle suivant? Au début afficheA est true, le reste est false. Après 10secondes, tous les attributs sont false. Ensuite après 3secondes afficheB passe à true. Ensuite après 5 secondes toutes les affiches sont à false. Ensuite après 8 secondes afficheC passe à true. Ensuite après 3secondes tout repasse à false. Ensuite après 2secondes on retourne dans la situation initiale (afficheA à true et le reste à false). Une seul attribut change à la fois.

    2/ Si je réalise le modèle comme indiqué plus haut, à chaque changement d'une des valeurs des affiches, un notifyChange() est fait sur TOUTES les vues. Hors je voudrais que le notifyChange() soit fait uniquement sur les vues de l'affiche dont l'attribut a été modifié... Je pensais donc avoir un modèle Affiche par type d'affiche (donc pour afficheA, afficheB, afficheC, afficheD) qui aurait l'arraylist<vues> contenant ses propres vues et la méthode notifyChange() et un modèle au dessus de ça qui gèrerait le tout (ce modèle général dirait au modèle concerné que sa valeur doit changer et le modèle concerné ferait un notifyChange() sur ses vues, ainsi les vues des autres affiches ne seraient pas notifiées). Pourriez-vous m'aider car je ne vois pas comment implémenter ceci...

    Merci d'avance et bonne journée.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    10 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2006
    Messages : 10 061
    Points : 15 766
    Points
    15 766
    Par défaut
    Ca me parait plus simple de faire une instance de modèle pour chaque affiche, plutot que de faire un seul modele avec une Collection d'affiches.

    Code java : 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
    import java.util.Observable;
     
    public class Model extends Observable {
     
    	private String name;
    	private boolean attribute;
     
    	public Model(String name, boolean state) {
    		this.name = name;
    		this.attribute = state;
    	}
     
    	public void setAttribute(boolean state) {
    		if (attribute != state) {
    			attribute = state;
    			setChanged();
    		}
    		notifyObservers();
    	}
     
    	public boolean getAttribute() {
    		return attribute;
    	}
     
    	@Override public String toString() {
    		return String.format("%s, attribute=%b", name, attribute); 
    	}
    }

    Ensuite, une vue qui est liée à une affiche
    Code java : 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
    import java.util.Observable;
    import java.util.Observer;
     
    public class View implements Observer {
     
    	public View(Model model) {
    		model.addObserver(this);
    		System.out.println("initial: "+model);
    	}
     
    	@Override public void update(Observable o, Object arg) {
    		Model affiche = (Model)o;
    		System.out.println("changed: "+affiche);
    	}
     
    }

    Et un contrôleur qui fait l'intégration de tout le reste:

    Code java : 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
    public class Controller implements Runnable {
     
    	Model model1 = new Model("affiche A",true);
    	Model model2 = new Model("affiche B",false);
    	Model model3 = new Model("affiche C",false);
     
    	View view1 = new View(model1);
    	View view2 = new View(model2);
    	View view3 = new View(model3);
     
    	public static void main(String[] args) throws Exception {
    		Controller ctrl = new Controller();
    		Thread th = new Thread(ctrl);
    		th.start();
    		th.join();
    	}
     
    	@Override public void run() {
    		sleep(10);
    		model1.setAttribute(false);
    		model2.setAttribute(false);
    		model3.setAttribute(false);
    		sleep(3);
    		model2.setAttribute(true);
    		sleep(5);
    		model1.setAttribute(false);
    		model2.setAttribute(false);
    		model3.setAttribute(false);
    		// etc.
    	}
     
    	void sleep(int sec) {
    		try {
    			Thread.sleep(sec*1000);
    		} catch (InterruptedException e) { } // ignore
    	}
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Problème d'implémentation du modèle MVC et timer
    Par alex2746 dans le forum Général Java
    Réponses: 2
    Dernier message: 14/12/2012, 15h12
  2. Implémentation MVC et Architecture 3 tiers en JAVA
    Par hmimoud dans le forum Architecture
    Réponses: 4
    Dernier message: 20/09/2012, 13h44
  3. Implémentation MVC et Architecture 3 tiers en Java
    Par hmimoud dans le forum Général Java
    Réponses: 1
    Dernier message: 11/09/2012, 12h19
  4. Réponses: 0
    Dernier message: 26/06/2010, 20h21
  5. Réponses: 1
    Dernier message: 05/02/2007, 00h40

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