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

觀察者模式深度解析:Java 實現與角色協作圖解

     編輯:Java 綜合教學

模式定義與四大角色

觀察者模式定義對象間一對多依賴,當主題狀態改變時,自動通知並更新所有觀察者。四大角色:

角色職責對應代碼
抽象主題管理觀察者集合,提供註冊/移除/通知接口Subject 接口
具體主題實現主題接口,持有具體狀態ConcreteSubject 類
抽象觀察者定義更新接口Watcher 接口
具體觀察者實現更新邏輯,響應主題變化ConcreteWatcher 類

類結構圖

觀察者模式類圖

Java 完整實現

1. 接口定義

// 抽象主題
public interface Subject {
    void addWatcher(Watcher watcher);
    void removeWatcher(Watcher watcher);
    void notify(String message);
}

// 抽象觀察者
public interface Watcher {
    void update(String message);
}

2. 具體主題實現

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);
    }
}

3. 具體觀察者實現

public class ConcreteWatcher implements Watcher {
    @Override
    public void update(String message) {
        System.out.println(this + ": " + message);
    }
}

4. 測試驗證

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 收到
    }
}

核心優勢

  • 解耦:主題與觀察者無直接依賴,僅通過接口交互。
  • 動態性:運行時可任意增減觀察者。
  • 廣播通信:一條通知自動分發給所有訂閱者。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved