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

Java 事件模型實現觀察者模式:自定義事件與 C# 委托機制對比

     編輯:Java 相關知識

Java 事件三要素

  1. 事件源:發生事件的物件。
  2. 事件監聽器:處理事件的物件。
  3. 事件對象:封裝事件狀態資訊,繼承 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 vs C# 事件機制對比

維度JavaC#說明
核心機制介面 + 多態委托 + 事件關鍵字Java 面向對象純粹;C# 封裝函數指針
運行時效率較高(多態分發)稍低(委托調用鏈)均為運行時綁定
支援靜態方法否是C# delegate 可綁定 static 方法
類型安全是是編譯期檢查參數
開發易用性需手寫註冊/移除代碼語言內建語法糖C# 少寫樣板代碼
實體層級兩級:事件源-監聽器三級:事件源-委托-處理器Java 介面不可實例化,運行時只有兩級實體

總結

Java 通過介面規範回調簽名,利用多態實現運行時動態分發,本質更符合面向對象原則;C# 委托提供語法便利性但引入額外間接層。兩者均實現「Don't call me, I'll call you」的控制反轉。

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