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
    [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

    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.

###raw>template_hook.ano_emploi###