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.

pkg8patterns/patterns19ObserverPattern.java
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}