00:00

Observer Design Pattern

What is the Observer Design Pattern?

The Observer Design Pattern is a behavioral design pattern. It is used when one object needs to inform other objects automatically whenever its state changes.

In simple words, it works like a subscription system. One object acts as a subject, and many other objects act as observers. When the subject changes, all registered observers are notified.

Real-Life Example

Think about a YouTube channel:

  • The YouTube channel is the Subject.
  • Subscribers are the Observers.
  • When a new video is uploaded, all subscribers get notified automatically.

This is exactly how the Observer Pattern works.

Key Components of Observer Pattern

  • Subject – Maintains a list of observers and notifies them of changes.
  • Observer – Defines a method to receive updates.
  • ConcreteSubject – Implements the subject and stores state.
  • ConcreteObserver – Implements the observer and reacts to updates.

When Should You Use Observer Pattern?

  • When multiple objects depend on one object’s state
  • When you want loose coupling between objects
  • When changes in one object should update others automatically

Observer Design Pattern – Java Example

Step 1: Create Observer Interface

public interface Observer {
    void update(String message);
}

Step 2: Create Subject Interface

import java.util.List;

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

Step 3: Create Concrete Subject

import java.util.ArrayList;
import java.util.List;

public class NewsChannel implements Subject {

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

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void setNews(String news) {
        this.news = news;
        notifyObservers();
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(news);
        }
    }
}

Step 4: Create Concrete Observers

public class NewsSubscriber implements Observer {

    private String name;

    public NewsSubscriber(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " received news: " + message);
    }
}

Step 5: Test the Observer Pattern

public class ObserverPatternDemo {

    public static void main(String[] args) {

        NewsChannel channel = new NewsChannel();

        Observer user1 = new NewsSubscriber("Amit");
        Observer user2 = new NewsSubscriber("Sandeep");

        channel.registerObserver(user1);
        channel.registerObserver(user2);

        channel.setNews("Observer Pattern Explained Simply!");
    }
}

Output

Amit received news: Observer Pattern Explained Simply!
Sandeep received news: Observer Pattern Explained Simply!

Advantages of Observer Pattern

  • Promotes loose coupling between objects
  • Easy to add or remove observers
  • Supports open-closed principle

Disadvantages of Observer Pattern

  • Too many observers can affect performance
  • Notification order is not guaranteed

Conclusion

The Observer Design Pattern is a powerful way to handle one-to-many relationships. It is commonly used in event handling systems, notification services, and real-time updates. By using this pattern, your code becomes flexible, clean, and easy to maintain.