在事件驅動編程中,事件源需管理多個監聽器,並在事件發生時逐一通知。若每個事件源都重複編寫「維護列表、遍歷通知」的樣板代碼,不僅冗餘,還違反單一職責原則。
建立一個專門的分發器類別,繼承集合類(如 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("參數值");
此模式適用於 Swing、JavaBeans、自定義事件框架等所有「一對多」通知場景,是觀察者模式的輕量級工程化實現。