觀察者模式定義對象間一對多依賴,當主題狀態改變時,自動通知並更新所有觀察者。四大角色:
| 角色 | 職責 | 對應代碼 |
|---|---|---|
| 抽象主題 | 管理觀察者集合,提供註冊/移除/通知接口 | Subject 接口 |
| 具體主題 | 實現主題接口,持有具體狀態 | ConcreteSubject 類 |
| 抽象觀察者 | 定義更新接口 | Watcher 接口 |
| 具體觀察者 | 實現更新邏輯,響應主題變化 | ConcreteWatcher 類 |

// 抽象主題
public interface Subject {
void addWatcher(Watcher watcher);
void removeWatcher(Watcher watcher);
void notify(String message);
}
// 抽象觀察者
public interface Watcher {
void update(String message);
}
public class ConcreteSubject implements Subject {
private List watchers = new ArrayList<>();
@Override
public void addWatcher(Watcher watcher) { watchers.add(watcher); }
@Override
public void removeWatcher(Watcher watcher) { watchers.remove(watcher); }
@Override
public void notify(String message) {
for (Watcher w : watchers) w.update(message);
}
}
public class ConcreteWatcher implements Watcher {
@Override
public void update(String message) {
System.out.println(this + ": " + message);
}
}
public class Test {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Watcher w1 = new ConcreteWatcher();
Watcher w2 = new ConcreteWatcher();
Watcher w3 = new ConcreteWatcher();
subject.addWatcher(w1);
subject.addWatcher(w2);
subject.addWatcher(w3);
subject.notify("Hello"); // 三個觀察者均收到
subject.removeWatcher(w1);
subject.notify("bye~"); // 僅 w2、w3 收到
}
}