Design patterns
patterns19ObserverPattern
- Path
- pkg8patterns/patterns19ObserverPattern.java
- Package
- pkg8patterns
- Study order
- 19
- Run
- Single-file source launch
- Command
- java pkg8patterns/patterns19ObserverPattern.java
There is no in-browser runner. This is the file from the curriculum, unchanged.
1package pkg8patterns;2 3/*4 * Observer (Behavioral)5 * ---------------------6 * INTENT: define a one-to-many dependency so that when one object changes state,7 * all its dependents are notified automatically.8 * UML: Subject + subscribe()/notify() ; Observers + update(state).9 * PROS: loose coupling; dynamic subscriptions; supports event-driven design.10 * CONS: notification order undefined; possible memory leaks (forgotten unsubscribe).11 * REAL-WORLD: listeners/events, pub-sub, reactive streams, MVC.12 */13import java.util.*;14 15public class patterns19ObserverPattern {16 17 interface Observer { void update(double price); }18 19 static class Stock { // Subject20 private final List<Observer> observers = new ArrayList<>();21 private double price;22 void subscribe(Observer o) { observers.add(o); }23 void unsubscribe(Observer o) { observers.remove(o); }24 void setPrice(double price) {25 this.price = price;26 for (Observer o : observers) o.update(price); // notify all27 }28 }29 30 public static void main(String[] args) {31 Stock stock = new Stock();32 Observer trader = p -> System.out.println("Trader sees price " + p);33 Observer logger = p -> System.out.println("Logger records price " + p);34 35 stock.subscribe(trader);36 stock.subscribe(logger);37 stock.setPrice(100.0);38 39 System.out.println("-- trader unsubscribes --");40 stock.unsubscribe(trader);41 stock.setPrice(105.5);42 }43}