π Observer Design Pattern in Java
The Observer Pattern is a behavioral design pattern where one object (subject) notifies a group of dependent objects (observers) whenever its state changes.
Itβs widely used in:
- UI event handling (e.g., button clicks)
- Notification systems
- Real-time updates (chat, stock prices, etc.)
π― Real-Life Analogy
π± Imagine a YouTube channel:
- You're the Subscriber (Observer)
- The Channel is the Subject
Whenever a new video is uploaded, you get notified. That's the Observer pattern in action!
π§ When to Use Observer Pattern?
- When multiple objects need to stay updated with changes in one object.
- When you're building event-driven systems.
- When you want to decouple subjects and their dependents.
π₯ Example β Notification System
Letβs build a system where users get notified when a new message is published.
πΈ Step 1: Create Observer Interface
interface Observer {
void update(String message);
}
πΈ Step 2: Concrete Observers (Subscribers)
class EmailSubscriber implements Observer {
private String email;
public EmailSubscriber(String email) {
this.email = email;
}
public void update(String message) {
System.out.println("Email to " + email + ": " + message);
}
}
class SMSSubscriber implements Observer {
private String phoneNumber;
public SMSSubscriber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public void update(String message) {
System.out.println("SMS to " + phoneNumber + ": " + message);
}
}
πΈ Step 3: Create Subject Interface
interface Subject {
void subscribe(Observer o);
void unsubscribe(Observer o);
void notifyObservers(String message);
}
πΈ Step 4: Concrete Subject (Publisher)
import java.util.ArrayList;
import java.util.List;
class MessagePublisher implements Subject {
private List<Observer> observers = new ArrayList<>();
public void subscribe(Observer o) {
observers.add(o);
}
public void unsubscribe(Observer o) {
observers.remove(o);
}
public void notifyObservers(String message) {
for (Observer o : observers) {
o.update(message);
}
}
}
πΈ Step 5: Test the System
public class ObserverDemo {
public static void main(String[] args) {
MessagePublisher publisher = new MessagePublisher();
Observer emailUser = new EmailSubscriber("ayan@xyz.com");
Observer smsUser = new SMSSubscriber("9876543210");
publisher.subscribe(emailUser);
publisher.subscribe(smsUser);
publisher.notifyObservers("π’ New Blog Post on Observer Pattern!");
publisher.unsubscribe(emailUser);
publisher.notifyObservers("π’ New Update: SOLID Principles Refreshed!");
}
}
β Output
Email to ayan@xyz.com: π’ New Blog Post on Observer Pattern!
SMS to 9876543210: π’ New Blog Post on Observer Pattern!
SMS to 9876543210: π’ New Update: SOLID Principles Refreshed!
π Key Concepts
| Concept | Description | | -------------- | -------------------------------------- | | Subject | Maintains list of observers | | Observer | Gets notified of changes | | Loose Coupling | Subject doesnβt care what observers do | | Flexibility | Can add/remove observers at runtime |
π Real-Time Use Cases
- β UI components (React/Angular bindings)
- β Event buses or messaging systems
- β Chat applications
- β Stock ticker updates
- β File system change monitors
π§ Interview Q&A
Q: What type of pattern is Observer? A: Behavioral
Q: What's the difference between Observer and Publisher-Subscriber? A:
- Observer is tightly coupled, usually direct references.
- Pub/Sub uses a message broker (like Kafka, RabbitMQ).
Q: Is Observer pattern used in Java libraries? A: Yes! For example:
java.util.Observer
(deprecated, but historically used)- Event listeners in Swing/AWT (UI frameworks)
π§ Observer vs Strategy vs Decorator
| Pattern | Purpose | | --------- | -------------------------------- | | Observer | Notify many on state change | | Strategy | Choose behavior at runtime | | Decorator | Add responsibilities dynamically |
π Summary
- β Observer helps you notify multiple objects when state changes.
- π Promotes loose coupling between subject and observers.
- π Easy to extend, reuse, and manage listeners.
- π§© Perfect for real-time, event-driven systems.