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

Java 觀察者模式全解析:從核心原理到手寫實現

     編輯:Java 相關知識

什麼是觀察者模式?

觀察者模式定義對象間的一對多依賴:當一個對象(主題/被觀察者)狀態發生改變時,所有依賴它的對象(觀察者)都會收到通知並自動更新。別名:發布-訂閱、模型-視圖、源-監聽器模式。

核心角色與結構

  • Subject(抽象主題):管理觀察者列表,提供註冊、移除、通知方法。
  • ConcreteSubject(具體主題):具體業務邏輯,狀態變化時調用通知。
  • Observer(抽象觀察者):定義更新介面 update()。
  • ConcreteObserver(具體觀察者):實現更新邏輯,同步主題狀態。

交互流程

  1. 觀察者調用 subject.add(observer) 註冊到主題容器。
  2. 主題狀態發生變化(如 change()),遍歷容器調用 observer.update(newState)。
  3. 觀察者收到通知,執行具體更新邏輯。
  4. 觀察者可調用 subject.delete(observer) 取消訂閱。

關鍵點:主題依賴抽象 Observer 介面而非具體類,實現鬆耦合、易擴展。

手寫核心代碼實現

1. 抽象主題類

public abstract class AbsRole {
    private List<IObserver> observers = new ArrayList<>();
    public void add(IObserver observer) { observers.add(observer); }
    public void delete(IObserver observer) { observers.remove(observer); }
    public void notifyObservers(String newState) {
        for (IObserver o : observers) o.update(newState);
    }
}

2. 具體主題

public class Role extends AbsRole {
    private String state;
    public void change(String newState) {
        this.state = newState;
        notifyObservers(state); // 狀態變更觸發通知
    }
}

3. 觀察者介面與實現

public interface IObserver { void update(String newState); }

public class ObserverObj1 implements IObserver {
    @Override public void update(String state) {
        System.out.println("觀察者1狀態:" + state);
    }
}
public class ObserverObj2 implements IObserver {
    @Override public void update(String state) {
        System.out.println("觀察者2狀態:" + state);
    }
}

4. 客戶端測試

public class Client {
    public static void main(String[] args) {
        Role subject = new Role();
        subject.add(new ObserverObj1());
        subject.add(new ObserverObj2());
        subject.change("update!"); 
        // 輸出:觀察者1/2 狀態:update!
    }
}

模式優勢與應用場景

  • 解耦:主題與觀察者無直接依賴,易於獨立變更。
  • 動態關係:運行時動態增減觀察者。
  • 廣播通訊:一條消息自動分發給多個訂閱者。

典型應用:GUI 事件監聽、消息隊列消費者、Spring 事件驅動、Redis Pub/Sub。

JDK 內置支持

Java 提供 java.util.Observable (類) 和 java.util.Observer (介面),但因 Observable 是類而非介面,限制復用,現實項目多採用自定義實現或事件總線(如 Guava EventBus、Spring ApplicationEvent)。

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