Observer = "one-to-many notification" like Youtube subscriptions, when a channel uploads a video, all subscribers get notified.
Example:
// Observer
interface Observer {
void update(String message);
}
// Concrete Observer
class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
public void update(String message) {
System.out.println(name + " received: " + message);
}
}
// Subject
interface Subject {
void addObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
// Concrete Subject
class Channel implements Subject {
private List<Observer> observers = new ArrayList<>();
private String latestVideo;
public void addObserver(Observer o) {
observers.add(o);
}
public void removeObserver(Observer o) {
observers.remove(o);
}
public void uploadVideo(String title) {
this.latestVideo = title;
notifyObservers();
}
public void notifyObservers() {
for (Observer o : observers) {
o.update(latestVideo);
}
}
}
How to use
Channel channel = new Channel();
Observer user1 = new User("A");
Observer user2 = new User("B");
channel.addObserver(user1);
channel.addObserver(user2);
channel.uploadVideo("New Design Pattern Video");
// A and B both get notified
When to use
- You need event-driven systems
- Multiple objects depend on one object’s state
- Want loose coupling
❌ When NOT to use
- Too many observers → performance issues
- Hard to track/debug notifications