import java.util.ArrayList; import java.util.List; // 1. Το Interface του Παρατηρητή interface StockObserver { void update(String stockName, double price); } // 2. Το Interface του Υποκειμένου (Subject) interface StockSubject { void attach(StockObserver observer); void detach(StockObserver observer); void notifyObservers(String stockName, double price); } // 3. Η Συγκεκριμένη Κλάση Υποκειμένου (Concrete Subject) class TechMarket implements StockSubject { private List observers = new ArrayList<>(); @Override public void attach(StockObserver observer) { observers.add(observer); } @Override public void detach(StockObserver observer) { observers.remove(observer); } @Override public void notifyObservers(String stockName, double price) { for (StockObserver observer : observers) { observer.update(stockName, price); } } // Μέθοδος που αλλάζει την κατάσταση και πυροδοτεί την ειδοποίηση public void setPrice(String stockName, double price) { System.out.println("\n[Market] Νέα τιμή για τη μετοχή " + stockName + ": " + price + "€"); notifyObservers(stockName, price); } } // 4. Συγκεκριμένοι Παρατηρητές (Concrete Observers) class MobileApp implements StockObserver { @Override public void update(String stockName, double price) { System.out.println("[Mobile App] Ειδοποίηση: Η τιμή της " + stockName + " ενημερώνθηκε σε " + price + "€"); } } class EmailAlert implements StockObserver { @Override public void update(String stockName, double price) { System.out.println("[Email] Ενημέρωση: Η τιμή της " + stockName + " ενημερώθηκε σε " + price + "€"); } } // --- Κύρια Κλάση Εκτέλεσης --- public class ObservableMarket { public static void main(String[] args) { TechMarket market = new TechMarket(); StockObserver app = new MobileApp(); StockObserver email = new EmailAlert(); // Εγγραφή παρατηρητών market.attach(app); market.attach(email); // Αλλαγή τιμής market.setPrice("TSLA", 750.50); // Αφαίρεση ενός παρατηρητή και νέα αλλαγή market.detach(email); market.setPrice("MSFT", 310.20); } }