首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 觀察者模式深度解析與實戰代碼示例

     編輯:Java 相關知識

什麼是觀察者模式

觀察者模式定義對象間一對多依賴,當一個對象(被觀察者/Subject)狀態改變時,所有依賴它的對象(觀察者/Observer)都會收到通知並自動更新。典型場景:事件監聽、消息推送、配置熱加載、MVC 架構中的 View 更新。

核心角色

  • Subject (被觀察者):維護觀察者列表,提供註冊/移除/通知方法。Java 中對應 java.util.Observable 類。
  • Observer (觀察者):定義更新接口 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

場景二:雙向觀察(既是觀察者又是被觀察者)

MultA 類

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(); // 將變化傳播給自己的觀察者
    }
}

MultB 類

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 變化

最佳實踐與注意事項

  1. 必須調用 setChanged():否則 notifyObservers() 不會觸發通知。
  2. 避免循環通知:雙向觀察時需加守衛條件,防止無限遞歸。
  3. 線程安全:Observable 非線程安全,多線程環境需自行同步或使用並發包替代方案。
  4. 現代替代方案:Guava EventBus、Spring ApplicationEvent、RxJava 等提供更強大的事件總線能力。

總結

觀察者模式實現了解耦的異步通知機制,是事件驅動架構的基石。掌握 JDK 內置實現與擴展技巧,能有效應對配置熱更新、UI 狀態同步等常見業務場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved