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.
This article demonstrates Observer pattern implementations in Java. Check the following examples.
Examples
Check the following examples of the Observer pattern implementation in Java.
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 | GitHub |
Other Code Implementations
Use the following links to check Observer pattern implementation in other programming languages.