// ==================================================
// Observer Design Pattern
// ==================================================
//
// What is Observer Pattern?
// Observer Pattern defines a one-to-many dependency between objects
// so that when one object (Subject) changes state, all its dependents
// (Observers) are notified and updated automatically.
//
// It is also known as the Publisher-Subscriber model.
//
// When to use:
// - When a change in one object requires changing others
// - When you want loose coupling between the event source and its listeners
// - When you want to add or remove listeners without modifying the source
//
// Key parts:
// 1. Subject (Publisher) → maintains list of observers and notifies them
// 2. Observer (Subscriber) → interface with an update method
// 3. Concrete Observers → classes that react to the notification
//
// Example used here: Student registration event
// When a student registers, multiple actions should happen:
// - Assign batch
// - Send email
// - Send Slack invite
//
// --------------------------------------------------
// Folder Structure (if kept as separate files):
//
// observer/
// ├── Observer.java
// ├── RegistrationSubject.java
// ├── BatchCreator.java
// ├── EmailService.java
// ├── SlackNotification.java
// └── ObserverDemo.java
// ==================================================
import java.util.ArrayList;
import java.util.List;
// ==================================================
// File: Observer.java
// Observer Interface
// All subscribers must implement this
// ==================================================
}
// ==================================================
// File: RegistrationSubject.java
// Subject (Publisher)
// Maintains list of observers and notifies them when an event occurs
// ==================================================
class RegistrationSubject {
private final List<Observer> observers = new ArrayList<>();
public void addObserver
(Observer observer
) { observers.add(observer);
}
public void removeObserver
(Observer observer
) { observers.remove(observer);
}
private void notifyObservers
(String eventType
) { observer.update(studentName, eventType);
}
}
public void registerStudent
(String studentName
) { this.studentName = studentName;
System.
out.
println("Student registered: " + studentName
); notifyObservers("STUDENT_REGISTERED");
}
}
// ==================================================
// File: BatchCreator.java
// Concrete Observer 1
// ==================================================
class BatchCreator
implements Observer { @Override
if ("STUDENT_REGISTERED".equals(eventType)) {
System.
out.
println("[BatchCreator] Assigned batch to " + studentName
); }
}
}
// ==================================================
// File: EmailService.java
// Concrete Observer 2
// ==================================================
class EmailService
implements Observer { @Override
if ("STUDENT_REGISTERED".equals(eventType)) {
System.
out.
println("[EmailService] Sent welcome email to " + studentName
); }
}
}
// ==================================================
// File: SlackNotification.java
// Concrete Observer 3
// ==================================================
class SlackNotification
implements Observer { @Override
if ("STUDENT_REGISTERED".equals(eventType)) {
System.
out.
println("[SlackNotification] Sent Slack invite to " + studentName
); }
}
}
// ==================================================
// File: ObserverDemo.java
// Client / Usage
// (public removed so it can compile in the same file)
// ==================================================
class ObserverDemo {
public static void main
(String[] args
) { RegistrationSubject registration = new RegistrationSubject();
Observer batchCreator
= new BatchCreator
(); Observer emailService
= new EmailService
(); Observer slack
= new SlackNotification
();
registration.addObserver(batchCreator);
registration.addObserver(emailService);
registration.addObserver(slack);
registration.registerStudent("Sai Harsha");
System.
out.
println("\n--- Removing Email Service ---"); registration.removeObserver(emailService);
registration.registerStudent("Another Student");
}
}