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

Java 監聽器模式解析:非侵入式設計、事件源與監聽器解耦、非僅限於按鈕

     編輯:程式設計綜合問答

核心特點

  1. 觀察者模式 經典實作:事件源 + 事件物件 + 監聽器介面。
  2. 介面導向:監聽器為單一方法介面 (SAM),Java 8+ 可用 Lambda 簡寫。
  3. 非侵入式:事件源不依賴具體監聽器實作,僅依賴介面。
  4. 多播:一個事件源可註冊多個監聽器。

標準結構

// 1. 事件物件 (承載上下文)
class MyEvent extends EventObject {
    private String message;
    public MyEvent(Object source, String msg) { super(source); this.message = msg; }
    public String getMessage() { return message; }
}

// 2. 監聽器介面 (擴充 EventListener 標記介面)
interface MyListener extends EventListener {
    void onEvent(MyEvent e); // 單一方法
}

// 3. 事件源 (維護監聽器列表、觸發)
class EventSource {
    private final List listeners = new CopyOnWriteArrayList<>(); // 執行緒安全
    
    public void addListener(MyListener l) { listeners.add(l); }
    public void removeListener(MyListener l) { listeners.remove(l); }
    
    protected void fireEvent(String msg) {
        MyEvent event = new MyEvent(this, msg);
        for (MyListener l : listeners) l.onEvent(event);
    }
}

反例:非所有監聽器都叫 onClick / 僅用於按鈕

監聽器事件來源方法名應用場景
ActionListenerButton, MenuItem, TimeractionPerformed動作觸發
MouseListenerComponentmouseClicked/Pressed/Released...滑鼠互動
KeyListenerComponentkeyPressed/Released/Typed鍵盤輸入
PropertyChangeListenerJavaBeanpropertyChange屬性變更綁定
HttpSessionListenerServlet ContainersessionCreated/DestroyedSession 生命週期
TimerTask / ScheduledExecutor排程器run()定時任務 (非 GUI)

Java 8+ Lambda 簡寫

button.addActionListener(e -> System.out.println("Clicked: " + e.getActionCommand()));
// 替代匿名內部類 new ActionListener() { ... }

自訂監聽器最佳實踐

  • 介面命名:`Listener` (如 `PaymentListener`)。
  • 方法命名:`on` (如 `onPaymentSuccess`)。
  • 事件物件攜帶不可變資料,避免監聽器修改源狀態。
  • 使用 CopyOnWriteArrayList 或 EventListenerList (Swing) 管理列表,保證執行緒安全與移除時不影響疊代。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved