Observer Pattern

April 2, 2026

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