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

JavaBeans 事件模型完整指南:事件狀態、監聽器介面、註冊機制與適配器模式

     編輯:J2EE

前言

事件機制是 JavaBeans 架構核心,實現元件間鬆耦合通訊。本文系統闡述事件狀態物件、事件監聽器介面、來源註冊/通知流程、適配器類別角色與標準設計模式。

1. 事件狀態物件

繼承 java.util.EventObject,封裝事件發生時的上下文資訊。慣例類別名以 Event 結尾。


public class MouseMovedEvent extends EventObject {
    private int x, y;
    public MouseMovedEvent(Component source, Point loc) {
        super(source); this.x = loc.x; this.y = loc.y;
    }
    public Point getLocation() { return new Point(x, y); }
}

2. 事件監聽器介面

繼承 java.util.EventListener (標記介面),定義回調方法。慣例介面名以 Listener 結尾。


public interface MouseMovedListener extends EventListener {
    void mouseMoved(MouseMovedEvent e);
}

實作類別即為監聽器:


public class MyListener implements MouseMovedListener {
    public void mouseMoved(MouseMovedEvent e) { /* 處理邏輯 */ }
}

3. 事件來源:註冊、通知、同步

來源類別維護監聽器清單,提供標準註冊/移除方法 (設計模式:add<ListenerType> / remove<ListenerType>)。


public abstract class EventSource {
    private Vector listeners = new Vector<>();

    public synchronized void addModelChangedListener(ModelChangedListener l) {
        listeners.addElement(l);
    }
    public synchronized void removeModelChangedListener(ModelChangedListener l) {
        listeners.removeElement(l);
    }

    protected void notifyModelChanged() {
        // 1. 複製清單 (快照) 避免通知過程中清單變動
        Vector snapshot;
        synchronized(this) { snapshot = (Vector) listeners.clone(); }

        // 2. 建立事件物件
        EventObject e = new EventObject(this);

        // 3. 逐一同步通知
        for (ModelChangedListener l : snapshot) {
            l.modelChanged(e);
        }
    }
}

關鍵點:synchronized 保護清單增刪與快照複製;快照模式避免 ConcurrentModificationException 且確保通知過程中新增/移除監聽器不影響本次廣播。

4. 適配器類別

當監聽器介面包含多個方法、或來源與監聽器類型不匹配、或需附加條件過濾時,引入適配器類別作為中介。

  • 適配器實作監聽器介面,內部持有真正處理邏輯的目標物件引用。
  • 來源註冊適配器而非真正監聽器。
  • IDE 代碼生成器 (如 NetBeans Matisse) 大量使用匿名內部類適配器。

// 範例:MouseAdapter 已實作 MouseListener/MouseMotionListener 所有方法為空
button.addMouseListener(new MouseAdapter() {
    @Override public void mouseClicked(MouseEvent e) { doSomething(); }
});

5. 事件模型設計要求 (規範節錄)

  • 提供公共框架支援事件型別與傳遞模型擴充。
  • 與 Java 語言/環境高度整合。
  • 事件可被建構工具捕獲/觸發。
  • 支援設計時控制事件連結。
  • 不依賴複雜開發工具即可實現。
  • 可發現類別產生/監聽的事件 (內省)。
  • 標準註冊機制支援動態操縱來源-監聽器關係。
  • 不需額外 VM/語言支援。
  • 高效事件傳遞。
  • 與其他元件架構事件模型中立映射。

總結:事件流向

  1. 來源狀態變更 → 建立 EventObject 子類實例。
  2. 來源遍歷監聽器快照 → 調用各監聽器回調方法傳入事件物件。
  3. 監聽器執行業務邏輯 (可能更新自身狀態、觸發後續事件)。
  4. 適配器可在中間轉換事件型別、過濾、委派。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved