java.util.EventObject。採用 發布/訂閱 模式:訂閱者向發布者註冊,事件觸發時發布者回調監聽器。
// 1. 事件對象
class ClickEvent extends EventObject {
public DemoBean source;
public ClickEvent(DemoBean source) { super(source); this.source = source; }
}
// 2. 監聽器介面
interface IClickListener extends EventListener {
void click(ClickEvent e);
}
// 3. 具體監聽器
class ClickListener implements IClickListener {
public void click(ClickEvent e) { System.out.println("clicked event happened"); }
}
// 4. 事件源
class DemoBean {
private Vector listeners = new Vector();
public synchronized void addExampleListener(IClickListener l) { listeners.add(l); }
public synchronized void removeExampleListener(IClickListener l) { listeners.remove(l); }
protected void doClickEvent() {
synchronized (this) {
ClickEvent e = new ClickEvent(this);
for (int i = 0; i < listeners.size(); i++)
((IClickListener)listeners.get(i)).click(e);
}
}
public void click() { doClickEvent(); }
}
// 5. 測試
public class Program {
public static void main(String[] args) {
DemoBean bean = new DemoBean();
bean.addExampleListener(new ClickListener());
bean.click(); // 輸出: clicked event happened
}
}
| 維度 | Java | C# | 說明 |
|---|---|---|---|
| 核心機制 | 介面 + 多態 | 委托 + 事件關鍵字 | Java 面向對象純粹;C# 封裝函數指針 |
| 運行時效率 | 較高(多態分發) | 稍低(委托調用鏈) | 均為運行時綁定 |
| 支援靜態方法 | 否 | 是 | C# delegate 可綁定 static 方法 |
| 類型安全 | 是 | 是 | 編譯期檢查參數 |
| 開發易用性 | 需手寫註冊/移除代碼 | 語言內建語法糖 | C# 少寫樣板代碼 |
| 實體層級 | 兩級:事件源-監聽器 | 三級:事件源-委托-處理器 | Java 介面不可實例化,運行時只有兩級實體 |
Java 通過介面規範回調簽名,利用多態實現運行時動態分發,本質更符合面向對象原則;C# 委托提供語法便利性但引入額外間接層。兩者均實現「Don't call me, I'll call you」的控制反轉。