Le design pattern Observer avec Java
le pattern observer en Java
Je vous conseille avant de lire la suite de cet article, de lire auparavant celui concernant le pattern observer https://example.org/posts/design-pattern-observer/
Ce besoin d’une classe qui émet une information et des classes qui écoutent ces signaux est tellement courant que le langage Java comprend déjà des classes utilitaires qui se chargent de tout le travail, ne reste plus qu’à l’ppliquer !
Voyons en détail comment cela fonctionne.
du coté du sujet
C’est très simple.
On ne conserve plus de liste d’observateur, plus de fonction pour ajouter/supprimer des observateurs : on étend juste la classe Observable et on crée juste une méthode changeValue qui appelle une méthode setChanged() et qui notifie ses observateurs avec un objet de contenu
package observerjava;
import java.util.Observable;
public class ConcreteSubject extends Observable {
private int value;
public void changeValue(int i){
this.value = i;
setChanged();
this.notifyObservers(value);
}
}
du coté des observateurs
Pas beaucoup plus compliqué. Cette fois-ci nous implémentons une interface Observer qui nous oblige à implémenter une méthode update, avec en paramètre l’objet qui émet et son message.
package observerjava;
import java.util.Observable;
import java.util.Observer;
public class ConcretObserver1 implements Observer {
private int value = 0;
@Override
public String toString() {
return this.value + "";
}
@Override
public void update(Observable o, Object arg) {
this.value = ((int) arg);
}
}
public class ConcretObserver2 implements Observer {
private int value = 0;
@Override
public String toString() {
return this.value + "";
}
@Override
public void update(Observable o, Object arg) {
this.value = ((int) arg);
}
}
et là ou tout s’enchaine
et maintenant la classe de mise en pratique
public class Main {
public static void main(String[] args) {
ConcreteSubject concreteSubject = new ConcreteSubject();
ConcretObserver1 concretObserver1 = new ConcretObserver1();
ConcretObserver2 concretObserver2 = new ConcretObserver2();
concreteSubject.addObserver(concretObserver1);
concreteSubject.addObserver(concretObserver2);
System.out.println(concretObserver1);
System.out.println(concretObserver2);
concreteSubject.changeValue(5);
System.out.println(concretObserver1);
System.out.println(concretObserver2);
}
}
/*
output de ce code
0
0
5
5
*/