Partage
  • Partager sur Facebook
  • Partager sur Twitter

Design Pattern Observer - Observable

    10 décembre 2014 à 19:28:03

    Bonjour à tous, j'ai un problème qui me chagrine.

    On a vu en cours je design pattern Observer - Observable mais je ne le comprend pas entièrement.
    OK, j'ai compris le système du notifyObservers et de la methode update mais ce que je ne comprend pas par exemple c'est comment faire passer des messages particuliers via la methode update.

    Je m'explique, en prenant un joueur de carte par exemple :

    public class Joueur extends Observable{
    	
    	private String pseudo;
    	private int score;
    	
    	private TasCartes main;
    	
    	
    	/**
    	 * @param pioche pioche du jeu
    	 * */
    	public void piocher(Pioche pioche){
    		//si la pioche n est pas vide on pioche dedans
    		if(pioche.isVide() == false){
    			this.main.ajouterCarte(pioche.supprimerCarteDessus(), 0);
    			System.out.println("Le joueur "+this.pseudo+" pioche une carte");
    		} else {
    			//ici on dis par exemple que la pioche est vide
                          
    		}
                    this.nofidyObservers
    
    	}

    Je ne comprend pas comment ecrire la methode update en disant : le jouer x vient de piocher une carte, ou bien : la pioche est vide

    Merci d'avance :) 




    • Partager sur Facebook
    • Partager sur Twitter
      12 décembre 2014 à 1:21:04

      Bonjour, j'ai aussi un problème avec ce fameux design pattern observer. Avec le cours de cysboy et maintenant j'ai un serieux probleme avec le TP sur le pendu. j'aimerai bien que l'on m'aide a comprendre ce fameux pattern. Merci d'avance.
      • Partager sur Facebook
      • Partager sur Twitter
      doums
        12 décembre 2014 à 6:57:24

        Salut

        Ta méthode update de l'interface observer est définie dans une de tes vues qui l'implémentent.

        Dans ton modèle (les données) qui implemente observable,tu crées un setter avec le paramètre utilisé dans ton update.Ex:

        public void setQte(int q) {              // on modif qte et on informe les vues
        		this.qte = q;
        		for(Observer o:observers){
        			o.update(qte);
        		}
        	}

        Dans ton main, tu peux donc :choisir ta donnée,ta vue, et addObserver(vue choisie).

        Mon ex simple ici:

        package interfaces;
        
        public interface Observable {
               public void addObserver(Observer observer);
               public void deleteObserver(Observer observer);
               
        }
        package interfaces;
        
        public interface Observer {
                  public void update(int qte);
        }
        package modele;
        
        import java.util.ArrayList;
        import java.util.List;
        
        import interfaces.Observable;
        import interfaces.Observer;
        
        public class Data1 extends Thread implements Observable {
        	      int qte;
                  private List<Observer> observers =new ArrayList<Observer>();
        	@Override
        	public void addObserver(Observer observer) {
        		
        		observers.add(observer);
        	}
        
        	@Override
        	public void deleteObserver(Observer observer) {
        		observers.remove(observer);
        		
        	}
        	
        	/**
        	 * @param q the qte to set
        	 */
        	public void setQte(int q) {              // on modif qte et on informe les vues
        		this.qte = q;
        		for(Observer o:observers){
        			o.update(qte);
        		}
        	}
        	@Override
        	public void run() {                     //auto chgt 
        		
        	        while(true){
        	        	int qte=(int) (Math.random()*250);
        	        	setQte(qte);
        	         
        	        try{
        	        Thread.sleep(2000);
        	        }
        	        catch(Exception e){
                    e.getMessage();	        	
        	        }
        	      }  
        		}
        	}
        package vue;
        
        import interfaces.Observer;
        
        public class View implements Observer{
        
        	@Override
        	public void update(int qte) {
        		if(qte>100){
        		 System.out.println("augmentation");
        	      System.out.println("quantite :"+qte);
        		}
        		else if(qte<100 && qte>30){
        			 System.out.println("stable");
        		      System.out.println("quantite :"+qte);
        		}
        		else{
        			System.out.println("baisse");
        		      System.out.println("quantite :"+qte);
        		}
        		
        	}
        
        }
        
        package main;
        import vue.View;
        import interfaces.Observer;
        import modele.Data1;
        
        public class App1 {
        
        	public static void main(String[] args) {
        		Data1 donnee =new Data1();
        		View o =new View();                     //m
        		donnee.addObserver(o);                  //v
        	    
        		donnee.start();                        //c
        		
        		
        		
        
        	}
        
        }

        Le data1 est automatique (thread).

        Bonne continuation.



        • Partager sur Facebook
        • Partager sur Twitter
          18 décembre 2014 à 19:01:09

          salut. les trois méthodes de l’interface observable ne varient pas?
          • Partager sur Facebook
          • Partager sur Twitter
          doums
            18 décembre 2014 à 20:25:05

            En fait ,j'utilise un thread avec un random sur le setdata.Mais tu peux bien sur implémenter plusieurs classes via l'interface.

            Regarde le main.Tout est là:ensuite remonte les appels

            -
            Edité par footsteps 19 décembre 2014 à 3:07:35

            • Partager sur Facebook
            • Partager sur Twitter

            Design Pattern Observer - Observable

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown