Définition
Le modèle d'observateur est utilisé lorsqu'il existe une relation un à plusieurs entre les objets, par exemple si un objet est modifié, ses objets dépendants doivent être notifiés automatiquement et les modifications correspondantes sont apportées à tous les objets dépendants.
Exemples
Supposons que votre adresse permanente soit modifiée, vous devez en informer l'autorité des passeports et l'autorité de la carte pan. Donc, ici, l'autorité de passeport et l'autorité de carte panoramique sont des observateurs et vous êtes un sujet.
Sur Facebook également, si vous vous abonnez à quelqu'un, chaque fois que de nouvelles mises à jour se produisent, vous en serez informé.
Quand l'utiliser:
Lorsqu'un objet change son état, tous les autres objets dépendants doivent automatiquement changer leur état pour maintenir la cohérence
Lorsque le sujet ne connaît pas le nombre d'observateurs dont il dispose.
Quand un objet doit pouvoir notifier d'autres objets sans savoir qui sont les objets.
Étape 1
Créer une classe de sujet.
Subject.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éez une classe Observateur.
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 des objets sujets et des observateurs concrets.
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