Définition
Le modèle de l'observateur est utilisé lorsqu'il existe une relation de type "un à plusieurs" entre les objets. Par exemple, si un objet est modifié, ses objets dépendants sont automatiquement notifiés et les changements correspondants sont effectués sur tous les objets dépendants.
Exemples
-
Si vous changez d'adresse permanente, vous devez en informer les autorités compétentes en matière de passeport et de carte d'identité. Donc ici l'autorité des passeports et l'autorité des cartes de crédit sont des observateurs et vous êtes un sujet.
-
Sur Facebook également, si vous vous abonnez à quelqu'un, vous serez averti de toute nouvelle mise à jour.
Quand l'utiliser :
-
Lorsqu'un objet change d'état, tous les autres objets dépendants doivent automatiquement changer d'état pour maintenir la cohérence.
-
Lorsque le sujet ne connaît pas le nombre d'observateurs qu'il a.
-
Quand un objet doit pouvoir notifier d'autres objets sans savoir qui sont ces objets.
Étape 1
Créer une classe de sujets.
Sujet.java
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers
= new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
Étape 2
Créer la classe Observer.
Observer.java
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
Étape 3
Créer des classes d'observateurs concrètes
BinaryObserver.java
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState() ) );
}
}
OctalObserver.java
public class OctalObserver extends Observer{
public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState() ) );
}
}
HexaObserver.java
public class HexaObserver extends Observer{
public HexaObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String: "
+ Integer.toHexString( subject.getState() ).toUpperCase() );
}
}
Étape 4
Utilisez le sujet et les objets concrets de l'observateur.
ObserverPatternDemo.java
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}
Étape 5
Vérifiez la sortie.
Premier changement d'état : 15
Chaîne hexagonale : F
Chaîne octale : 17
Chaîne binaire : 1111
Deuxième changement d'état : 10
Chaîne hexagonale : A
Chaîne octale : 12
Chaîne binaire : 1010
0 votes
Le lien ne fonctionne pas. @Androider Pouvez-vous fournir un lien actualisé ?
0 votes
Si vous utilisez Java 6 ou plus, essayez ceci dzone.com/articles/java-ee6-events-lightweight
1 votes
Je vous conseille vivement de lire ce livre pour avoir une bonne compréhension des modèles de conception. Cela peut sembler idiot, mais c'est un excellent outil d'apprentissage.
1 votes
Tout le monde doit noter que ; Observer/Observable est déprécié dans Java 9. Alternatives : stackoverflow.com/questions/46380073/
0 votes
Est-ce utile ? sourcemaking.com/design_patterns/observer ?
0 votes
Un autre : refactoring.guru/design-patterns/observer