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

Java 與 C# 事件處理機制深度對比:從觀察者模式到委派事件

     編輯:關於C#

核心架構差異:兩級 vs 三級實體模型

Java 採用事件源–事件監聽者的兩級模型;C# 引入委派,形成事件源–委派–事件處理器的三級模型。這一差異直接影響了鬆耦合程度、擴充性與程式碼組織方式。

Java 事件模型:標準化的監聽者介面

核心三要素

  1. 事件狀態物件:繼承 java.util.EventObject,封裝事件相關資料(如滑鼠座標)。慣例命名以 Event 結尾。
  2. 事件監聽者介面:繼承 java.util.EventListener,定義處理方法(如 mouseMoved(MouseEvent e))。慣例命名以 Listener 結尾。
  3. 事件源:提供 addXxxListener/removeXxxListener 註冊/註銷方法,內部維護監聽者集合,事件觸發時遍歷呼叫。

代碼結構範例

// 事件物件
public class MouseMovedEvent extends EventObject {
    private Point location;
    public MouseMovedEvent(Component source, Point loc) { super(source); this.location = loc; }
    public Point getLocation() { return location; }
}

// 監聽者介面
public interface MouseMovedListener extends EventListener {
    void mouseMoved(MouseMovedEvent e);
}

// 事件源
public class EventSource {
    private List listeners = new ArrayList<>();
    public synchronized void addMouseMovedListener(MouseMovedListener l) { listeners.add(l); }
    public synchronized void removeMouseMovedListener(MouseMovedListener l) { listeners.remove(l); }
    protected void fireMouseMoved(Point p) {
        MouseMovedEvent e = new MouseMovedEvent(this, p);
        for (MouseMovedListener l : listeners) l.mouseMoved(e);
    }
}

適配器模式

當監聽者介面方法過多,或需增加邏輯(如過濾、轉發)時,引入適配器類實作介面,再委派給真正處理者。多數 IDE 產生的事件代碼均採用此模式。

C# 事件模型:委派驅動的靈活機制

委派——類型安全的函式指標

delegate 定義方法簽章,實例可引用符合簽章的靜態/實例方法。支援多播(+/- 操作),一個委派可串聯多個方法。

// .NET 內建委派
public delegate void EventHandler(object sender, EventArgs e);

事件宣告與訂閱

public class Button {
    public event EventHandler Click; // 事件成員
}

// 使用端
Button btn = new Button();
btn.Click += new EventHandler(OnClick); // 訂閱
btn.Click -= new EventHandler(OnClick); // 退訂

private void OnClick(object sender, EventArgs e) { /* 處理 */ }

自訂委派與事件參數

public delegate int MyHandler(object sender, ToolBarButtonClickEventArgs e);
public event MyHandler CustomEvent;

// 訂閱
CustomEvent += new MyHandler(MyMethod);

處理器簽章完全由委派決定,不拘泥於固定的 (object, EventArgs) 形式,極大提升靈活性。

深度對比總結

維度JavaC#
模型層級兩級(源–監聽者)三級(源–委派–處理器)
介面耦合強:監聽者必須實作特定介面弱:僅需符合委派簽章的方法
多播支援手動維護集合遍歷語言原生支援(+=/-=)
方法簽章靈活性固定:單一 EventObject 參數自由:由委派定義任意參數
適配器需求常見(介面方法多、需邏輯隔離)較少(Lambda/匿名方法內建適配)
型別安全編譯期介面檢查編譯期委派簽章檢查

演進與融合

C# 的委派/事件本質上是觀察者模式的語言級實現,消除了手工管理監聽者集合的樣板代碼。Java 8 引入 Lambda 與函式式介面,亦可簡化監聽者寫法,但核心模型差異依存。理解兩者本質,有助於跨平台架構設計與技術選型。

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