DEV Community

eidher
eidher

Posted on • Edited on

2 1

Observer Pattern

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
Alt Text

Participants

  • Subject: knows its observers. Any number of Observer objects may observe a subject. Provides an interface for attaching and detaching Observer objects.
  • ConcreteSubject: stores state of interest to ConcreteObserver. Sends a notification to its observers when its state changes
  • Observer: defines an updating interface for objects that should be notified of changes in a subject.
  • ConcreteObserver: maintains a reference to a ConcreteSubject object. Stores state that should stay consistent with the subject's. Implements the Observer updating interface to keep its state consistent with the subject's.

Code

public class Main {

    public static void main(String[] args) {
        ConcreteSubject s = new ConcreteSubject();
        s.attach(new ConcreteObserver(s, "X"));
        s.attach(new ConcreteObserver(s, "Y"));
        s.attach(new ConcreteObserver(s, "Z"));
        s.setSubjectState("ABC");
        s.notifyObservers();
    }
}

public class Subject {

    private List<Observer> observers = new ArrayList<>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer o : observers) {
            o.update();
        }
    }
}

public class ConcreteSubject extends Subject {

    private String subjectState;

    public String getSubjectState() {
        return subjectState;
    }

    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
    }    
}

public interface Observer {

    void update();
}

public class ConcreteObserver implements Observer {

    private String name;
    private ConcreteSubject subject;

    public ConcreteObserver(ConcreteSubject subject, String name) {
        this.subject = subject;
        this.name = name;
    }

    @Override
    public void update() {
        String observerState = subject.getSubjectState();
        System.out.println("Observer " + name + " state is " + observerState);
    }
}
Enter fullscreen mode Exit fullscreen mode

Output

Observer X state is ABC
Observer Y state is ABC
Observer Z state is ABC
Enter fullscreen mode Exit fullscreen mode

Java Builtin Observer

public class Main {

    public static void main(String[] args) {
        ConcreteSubject s = new ConcreteSubject();
        s.addObserver(new ConcreteObserver(s, "X"));
        s.addObserver(new ConcreteObserver(s, "Y"));
        s.addObserver(new ConcreteObserver(s, "Z"));
        s.setSubjectState("ABC");
        s.notifyObservers();
    }
}

import java.util.Observable;

public class ConcreteSubject extends Observable {

    private String subjectState;

    public String getSubjectState() {
        return subjectState;
    }

    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
        setChanged();
    }

}

import java.util.Observable;
import java.util.Observer;

public class ConcreteObserver implements Observer {

    Observable subject;
    private String name;

    public ConcreteObserver(Observable subject, String name) {
        this.subject = subject;
        this.name = name;
    }

    @Override
    public void update(Observable obs, Object arg) {
        if(obs instanceof ConcreteSubject) {
            ConcreteSubject observable = (ConcreteSubject)obs;
            System.out.println("Observer " + name + " state is " + observable.getSubjectState());
        }       
    }
}
Enter fullscreen mode Exit fullscreen mode

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay