Exemple d'observateur de propriétés avec PropertyChangeListener en Java

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class Main {

  public static void main(String[] args) throws InterruptedException {
    POJO obj = new POJO();

    /* Ajoute l'observateur */
    ValuePropertyChangeListener change = new ValuePropertyChangeListener();
    obj.addPropertyChangeListener("value", change);

    /* Change la valeur toutes les secondes jusqu'à 5 */
    for (int i = 1; i <= 5; i++) {
      obj.setValue(i);
      Thread.sleep(1000);
    }

  }

}

class ValuePropertyChangeListener implements PropertyChangeListener {

  /* Cette fonction est appelée quand la valeur change */
  @Override
  public void propertyChange(PropertyChangeEvent evt) {

    /* Récupère l'objet source */
    POJO obj = (POJO) evt.getSource();

    /* Récupère l'ancienne et la nouvelle valeur */
    System.out.println("La valeur est passée de " + evt.getOldValue() + " à " + evt.getNewValue());
    System.out.println(obj + "\n");

  }

}

class POJO {

  private int value;

  /* Pour ajouter des observateurs de propriétés */
  private final PropertyChangeSupport support = new PropertyChangeSupport(this);

  public void setValue(int value) {
    /* Récupère l'ancienne valeur */
    int oldValue = this.value;

    /* Change la valeur de l'objet courant */
    this.value = value;

    /* Prévient les observateurs que la valeur a changée */
    support.firePropertyChange("value", oldValue, this.value);
  }

  /* Permet d'ajouter des observateurs */
  public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    support.addPropertyChangeListener(propertyName, listener);
  }

  @Override
  public String toString() {
    return "POJO [value=" + value + "]";
  }

}

Commentaires