觀察者模式定義對象間一對多依賴,當一個對象(被觀察者/Subject)狀態改變時,所有依賴它的對象(觀察者/Observer)都會收到通知並自動更新。典型場景:事件監聽、消息推送、配置熱加載、MVC 架構中的 View 更新。
java.util.Observable 類。update(Observable o, Object arg),Java 中對應 java.util.Observer 接口。public class NumberObservable extends Observable {
private int data = 0;
public void setData(int data) {
this.data = data;
setChanged(); // 標記狀態已改變
notifyObservers(); // 通知所有觀察者
}
public int getData() { return data; }
}
public class NumberObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
NumberObservable subject = (NumberObservable) o;
System.out.println("數據已變更為: " + subject.getData());
}
}
public class Test {
public static void main(String[] args) {
NumberObservable subject = new NumberObservable();
subject.addObserver(new NumberObserver());
subject.setData(1);
subject.setData(2);
subject.setData(3);
}
}
// 輸出:
// 數據已變更為: 1
// 數據已變更為: 2
// 數據已變更為: 3
public class MultA extends Observable implements Observer {
@Override
public void update(Observable o, Object arg) {
MultB multB = (MultB) o;
System.out.println("MultA 監聽到 MultB 數據變化");
setChanged();
notifyObservers(); // 將變化傳播給自己的觀察者
}
}
public class MultB extends Observable implements Observer {
private int data = 0;
@Override
public void update(Observable o, Object arg) {
System.out.println("MultB 察覺到 MultA 變化");
}
public void setData(int data) {
this.data = data;
setChanged();
notifyObservers();
}
}
public class Test {
public static void main(String[] args) {
MultA a = new MultA();
MultB b = new MultB();
b.addObserver(a); // B 被 A 觀察
a.addObserver(b); // A 被 B 觀察
b.setData(1); // 觸發鏈式通知
}
}
// 輸出:
// MultA 監聽到 MultB 數據變化
// MultB 察覺到 MultA 變化
觀察者模式實現了解耦的異步通知機制,是事件驅動架構的基石。掌握 JDK 內置實現與擴展技巧,能有效應對配置熱更新、UI 狀態同步等常見業務場景。