// ========================================== // 1. ΤΟ INTERFACE ΤΟΥ ΠΑΡΑΤΗΡΗΤΗ (OBSERVER) // ========================================== interface Observer { // Η μέθοδος που καλείται από το Subject για την ενημέρωση void update(String data); } // ========================================== // 2. ΤΟ INTERFACE ΤΟΥ ΥΠΟΚΕΙΜΕΝΟΥ (SUBJECT) // ========================================== interface Subject { void attach(Observer o); // Προσθήκη παρατηρητή void detach(Observer o); // Διαγραφή παρατηρητή void notifyObservers(); // Ενημέρωση όλων των παρατηρητών } // ========================================== // 3. Η ΣΥΓΚΕΚΡΙΜΕΝΗ ΚΛΑΣΗ ΥΠΟΚΕΙΜΕΝΟΥ // (CONCRETE SUBJECT) // ========================================== class ConcreteSubject implements Subject { // Η λίστα των παρατηρητών private List observers = new ArrayList<>(); // Η κατάσταση του παρατηρούμενου αντικειμένου private String state; @Override public void attach(Observer o) { observers.add(o); } @Override public void detach(Observer o) { observers.remove(o); } @Override public void notifyObservers() { for (Observer o : observers) { o.update(state); // Ενημέρωση κάθε παρατηρητή } } // Η μέθοδος που αλλάζει την κατάσταση (state) public void setState(String newState) { this.state = newState; notifyObservers(); // Πυροδότηση ειδοποιήσεων } } // ========================================== // 4. ΣΥΓΚΕΚΡΙΜΕΝΟΙ ΠΑΡΑΤΗΡΗΤΕΣ // (CONCRETE OBSERVERS) // ========================================== class ConcreteObserverA implements Observer { @Override public void update(String data) { // Αντίδραση στην αλλαγή (π.χ. Logging) System.out.println("Observer A: State changed to: " + data); } } class ConcreteObserverB implements Observer { @Override public void update(String data) { // Διαφορετική αντίδραση (π.χ. αποστολή e-mail) System.out.println("Observer B: Sending e-mail about state change: " + data); } }