mercredi 23 juillet 2014

Un pattern observer en Java


Dans la série des patterns que l'on retrouve souvent dans le monde du développement, le pattern observer est très fréquemment utilisé. En java, ce pattern peut être mis en place très simplement avec l'aide des classes de java.util du JDK : java.util.Observablejava.util.Observer

java.util.Observable : représente le sujet, c'est à dire l'objet qui doit être observé

java.util.Observer : représente une entité qui doit se tenir informée de l'évolution du sujet


Pour mettre en place ce pattern, mettons en place un objet observable, notre sujet. Cet objet qui hérite de java.util.Observable détient une information utile qui intéressera nos observateurs, la température.
package org.benc.observer.javautil;

public class Sujet extends java.util.Observable {

int temperature;

public int getTemperature() {
     return temperature;
  }

public void setTemperature(int temperature) {
    this.temperature = temperature;
    setChanged(); // J'informe que mon état a changé
  }
}

Puis implémentons notre objet qui observe, héritant de ll'interface java.util.Observer
package org.benc.observer.javautil;

public class Observer implements java.util.Observer {

String nom;

public Observer(java.util.Observable o, String nom) {
    this.nom = nom;
    o.addObserver(this); // A l'instanciation, je m'enregistre auprès du sujet que je souhaite suivre
  }

public void update(java.util.Observable o, Object arg) {
  if(o instanceof Sujet) {
    Sujet sujet = (Sujet) o;
    System.out.println("Moi, "+nom+", je suis informé de la nouvelle valeur de mon sujet : "+valeurAffichage);
  }
  // Si je m'intéresse à d'autres types de sujet, je traite les autres cas
  // if(o instanceof Sujet2) ...
 }
}

Et c'est tout !

On peut alors tester nos deux classes avec le bout de code suivant.
package org.benc.observer.javautil;

public class Main {

public static void main(String[] args) {
  Sujet monUniqueSujet = new Sujet();

  new Observer((Sujet) monUniqueSujet, "R1D1");
  new Observer((Sujet) monUniqueSujet, "R2D2");

  monUniqueSujet.setTemperature(18);
  monUniqueSujet.notifyObservers();

  monUniqueSujet.setTemperature(180); 
  monUniqueSujet.notifyObservers();
 }
}

Ce qui affichera :
Moi, R2D2, je suis informé de la nouvelle valeur de mon sujet : 18
Moi, R1D1, je suis informé de la nouvelle valeur de mon sujet : 18
Moi, R2D2, je suis informé de la nouvelle valeur de mon sujet : 180
Moi, R1D1, je suis informé de la nouvelle valeur de mon sujet : 180

Aucun commentaire:

Enregistrer un commentaire

Un avis ? Une question ?
N'hésitez pas à laissez des commentaires !