Observer pattern is used to automatically notify state change in object to all its dependent objects. It works as a pub/sub for state change between objects.
Check complete details and explanations about Observer pattern in the article: Observer Design Pattern
This article demonstrates Observer pattern implementations in Java. Check the following examples.
Example #1: General Observer
Let’s consider a general example of a simple Observer pattern demonstration.
Class Diagram
Take a look at the class diagram.

Subject Interface
// Subject.java
package com.bigboxcode.designpattern.observer.observer;
public interface Subject {
int getState();
void setState(int state);
void attach(Observer observer);
void notifyObservers();
}
Concrete Subject
// ConcreteSubject.java
package com.bigboxcode.designpattern.observer.observer;
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject{
private int state;
private List<Observer> observerList = new ArrayList<>();
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObservers();
}
public void attach(Observer observer) {
observerList.add(observer);
}
public void notifyObservers() {
for (Observer observer : observerList) {
observer.sendUpdate();
}
}
}
Observer Interface
package com.bigboxcode.designpattern.observer.observer;
public abstract class Observer {
protected Subject subject;
public abstract void sendUpdate();
}
Observer One
package com.bigboxcode.designpattern.observer.observer;
public class ObserverOne extends Observer{
public ObserverOne(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void sendUpdate() {
System.out.println( "Received in ObserverOne: " + subject.getState());
}
}
Observer Two
package com.bigboxcode.designpattern.observer.observer;
public class ObserverTwo extends Observer{
public ObserverTwo(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void sendUpdate() {
System.out.println( "Received in ObserverTwo: " + subject.getState());
}
}
Demo
// Demo.java
package com.bigboxcode.designpattern.observer.observer;
public class Demo {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
new ObserverOne(subject);
new ObserverTwo(subject);
System.out.println("Setting subject value to 10");
subject.setState(10);
System.out.println("\n-----------------------------\n");
System.out.println("Setting subject value to 999");
subject.setState(999);
}
}
Output
Setting subject value to 10
Received in ObserverOne: 10
Received in ObserverTwo: 10
-----------------------------
Setting subject value to 999
Received in ObserverOne: 999
Received in ObserverTwo: 999
Source Code
Use the following link to get the source code:
Example | Source Code Link |
---|---|
Example #1: General Observer | ![]() |