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

深度解析 Java 設計模式中觀察者模式的應用與實踐

     編輯:Java 相關知識

觀察者模式核心概念

觀察者模式定義了對象之間的一種一對多依賴關係,當一個對象(被觀察者/主題)狀態發生改變時,所有依賴於它的對象(觀察者)都會得到通知並自動更新。作為行為型設計模式,它廣泛應用於事件處理系統、GUI 程式設計、消息推送等場景。

模式結構與角色

標準觀察者模式包含四個核心角色:

  • 抽象主題:定義註冊、移除、通知觀察者的介面,通常包含觀察者集合容器
  • 抽象觀察者:定義更新介面,通常只有一個 update() 方法
  • 具體主題:實現抽象主題,包含具體業務邏輯與狀態變更觸發通知
  • 具體觀察者:實現抽象觀察者,定義收到通知後的具體處理邏輯

代碼實現範例

主題介面

public interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyAllObservers();
}

觀察者介面

public interface Observer {
    void update(Subject s);
}

具體主題:獵頭公司

import java.util.ArrayList;

public class HeadHunter implements Subject {
    private ArrayList<Observer> userList = new ArrayList<>();
    private ArrayList<String> jobs = new ArrayList<>();

    @Override
    public void registerObserver(Observer o) {
        userList.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        userList.remove(o);
    }

    @Override
    public void notifyAllObservers() {
        for (Observer o : userList) {
            o.update(this);
        }
    }

    public void addJob(String job) {
        jobs.add(job);
        notifyAllObservers();
    }

    public ArrayList<String> getJobs() {
        return jobs;
    }
}

具體觀察者:求職者

public class JobSeeker implements Observer {
    private String name;

    public JobSeeker(String name) {
        this.name = name;
    }

    @Override
    public void update(Subject s) {
        System.out.println(name + " 收到通知!");
        System.out.println("職位列表:" + s);
    }
}

客戶端測試

public class Main {
    public static void main(String[] args) {
        HeadHunter hh = new HeadHunter();
        hh.registerObserver(new JobSeeker("Mike"));
        hh.registerObserver(new JobSeeker("Chris"));
        hh.registerObserver(new JobSeeker("Jeff"));

        hh.addJob("Google 職位");
        hh.addJob("Yahoo 職位");
    }
}

優缺點分析

優點

  • 鬆耦合:主題與觀察者之間只有抽象依賴,易於擴展
  • 觸發機制:形成觸發鏈,支援廣播式通知
  • 符合開閉原則:新增觀察者無需修改主題代碼

缺點

  • 性能隱憂:觀察者過多時,鏈式通知可能導致延遲
  • 循環引用風險:若觀察者在更新時再次觸發主題變更,可能導致死循環
  • 通知順序不可控:預設按註冊順序通知,特定業務可能需要優先級控制

JDK 內建支援

Java 標準庫提供 java.util.Observer 介面與 java.util.Observable 類,但注意:Observable 是類而非介面,限制了復用靈活性。Java 9 起標記為過時,建議改用 PropertyChangeListener、Flow API 或第三方事件總線(如 Guava EventBus、RxJava)。

實戰應用場景

  • GUI 事件處理(AWT/Swing 的 Delegation Event Model)
  • 消息隊列/發布訂閱系統
  • 模型-視圖分離(MVC 架構中 Model 變更通知 View)
  • 日誌/監控系統的多端輸出

最佳實踐建議

  1. 優先使用介面而非抽象類定義觀察者契約
  2. 考慮異步通知機制避免阻塞主題執行緒
  3. 提供註冊時指定關注事件類型的能力(事件分類)
  4. 實現觀察者的 equals/hashCode 避免重複註冊
  5. 注意記憶體洩漏:主題持有觀察者強引用,需及時移除
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved