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

事件分發器模式:優雅解耦事件源與監聽器

     編輯:Java 程式設計入門

問題背景

在事件驅動編程中,事件源需管理多個監聽器,並在事件發生時逐一通知。若每個事件源都重複編寫「維護列表、遍歷通知」的樣板代碼,不僅冗餘,還違反單一職責原則。

解決方案:Dispatcher 模式

建立一個專門的分發器類別,繼承集合類(如 Vector)並實作監聽器介面,封裝「註冊、移除、分發」邏輯:

interface XXXListener {
    void event1Happens(String param);
    void event2Happens(String param);
}

class XXXDispatcher extends Vector<XXXListener> implements XXXListener {
    public void event1Happens(String param) {
        for (XXXListener listener : this) {
            listener.event1Happens(param);
        }
    }

    public void event2Happens(String param) {
        for (XXXListener listener : this) {
            listener.event2Happens(param);
        }
    }
}

設計要點:

  • 繼承 Vector 直接獲得線程安全的動態陣列能力(現代建議用 CopyOnWriteArrayList)
  • 實作 XXXListener 介面:利用 IDE 自動生成所有方法存根,確保簽名一致
  • 各事件方法內部遍歷集合並轉發調用

使用方式

// 事件源持有分發器實例
XXXDispatcher dispatcher = new XXXDispatcher();

// 註冊/移除監聽器 → 直接代理給分發器
public void addXXXListener(XXXListener l) { dispatcher.add(l); }
public void removeXXXListener(XXXListener l) { dispatcher.remove(l); }

// 觸發事件 → 一行代碼委派分發器
dispatcher.event1Happens("參數值");

優勢總結

  1. 零樣板碼:事件源無需重寫管理邏輯
  2. 單一職責:分發器專司分發,事件源專司業務
  3. 易擴展:新增事件類型只需在介面與分發器添加方法
  4. IDE 友好:實作介面可自動生成方法,減少拼寫錯誤

此模式適用於 Swing、JavaBeans、自定義事件框架等所有「一對多」通知場景,是觀察者模式的輕量級工程化實現。

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