Observer
When to Use
Implementation
Example: Stock Market Ticker
import java.util.ArrayList;
import java.util.List;
// 1. Subject (Observable)
interface StockSubject {
void registerObserver(StockObserver o);
void removeObserver(StockObserver o);
void notifyObservers();
}
class StockMarket implements StockSubject {
private List<StockObserver> observers;
private String stockSymbol;
private double price;
public StockMarket() {
observers = new ArrayList<>();
}
public void setPrice(String stockSymbol, double price) {
this.stockSymbol = stockSymbol;
this.price = price;
notifyObservers(); // State changed, notify all!
}
@Override
public void registerObserver(StockObserver o) {
observers.add(o);
}
@Override
public void removeObserver(StockObserver o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (StockObserver observer : observers) {
observer.update(stockSymbol, price);
}
}
}
// 2. Observer Interface
interface StockObserver {
void update(String stockSymbol, double price);
}
// 3. Concrete Observers
class MobileApp implements StockObserver {
private String name;
public MobileApp(String name) { this.name = name; }
@Override
public void update(String stockSymbol, double price) {
System.out.println("Mobile App (" + name + "): " + stockSymbol + " is now $" + price);
}
}
class DisplayBoard implements StockObserver {
@Override
public void update(String stockSymbol, double price) {
System.out.println("Wall Display: " + stockSymbol + " -> " + price);
}
}
// Usage
public class Main {
public static void main(String[] args) {
StockMarket nasdaq = new StockMarket();
StockObserver app1 = new MobileApp("User A");
StockObserver app2 = new MobileApp("User B");
StockObserver board = new DisplayBoard();
// Register
nasdaq.registerObserver(app1);
nasdaq.registerObserver(app2);
nasdaq.registerObserver(board);
// State change
System.out.println("--- Market Open ---");
nasdaq.setPrice("AAPL", 150.00);
System.out.println("--- Market Update ---");
nasdaq.removeObserver(app2); // User B unsubscribes
nasdaq.setPrice("AAPL", 155.00);
}
}Class Diagram
Output
Push vs Pull Model
Push Model (Used above)
Pull Model
Real-World Examples
Code Example: Java Built-in (Deprecated) vs PropertyChangeListener
Pros & Cons
Last updated