// ================================================== // 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 // ================================================== interface Observer { void update(String studentName, String eventType); } // ================================================== // File: RegistrationSubject.java // Subject (Publisher) // Maintains list of observers and notifies them when an event occurs // ================================================== class RegistrationSubject { private final List observers = new ArrayList<>(); private String studentName; public void addObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } private void notifyObservers(String eventType) { for (Observer observer : observers) { 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 public void update(String studentName, String eventType) { if ("STUDENT_REGISTERED".equals(eventType)) { System.out.println("[BatchCreator] Assigned batch to " + studentName); } } } // ================================================== // File: EmailService.java // Concrete Observer 2 // ================================================== class EmailService implements Observer { @Override public void update(String studentName, String eventType) { 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 public void update(String studentName, String eventType) { 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"); } }