You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// A delegate is a type that represents references to methods // with a particular parameter list and return type.delegatevoid SampleEventHandler(/* params */);// The event keyword is used to declare an event in a publisher class.
event SampleEventHandler SampleEvent;
// An event in Java can be a collection of event handlers.HashSet<ISampleEventHandler> sampleEvent = newHashSet();
那麼,接下來我們只需要依樣畫葫蘆就好了:
事件監聽目標(Event Target)
/** * A sample of event target in Java. **/classSampleEventTarget {
// Defines an event handler.@FunctionalInterfaceinterfaceISampleEventHandler {
voidinvoke(/* params */);
}
// An event in Java can be a collection of event handlers.HashSet<ISampleEventHandler> sampleEvent = newHashSet();
// Event dispatching.// Dispatch sampleEvent somewhere in member methods.// sampleEvent.forEach { handler -> handler.invoke(/* params */); };
}
事件監聽器(Event Listener)
/** * A sample of event listener in Java. **/classSampleEventListener {
voidonSampleEventInvoked(/* params */) {
// Handle event here.
}
}
背景
在軟件開發中,「事件驅動架構(簡稱 EDA,下同)」是實現松耦合系統設計的其中一種模式。
源於 .Net 的靈感
在 .Net 中,「委託(Delegation)」是實現 EDA 的基本模式,其「事件(Event)」通過
delegate
關鍵字和event
關鍵字 聲明定義:而「事件」則由「事件監聽目標(Event Target)」觸發(Dispatch),并由「事件監聽器(Event Listener)」監聽(Listen)。
事件監聽目標(Event Target)
一個「事件監聽目標」通常負責:
事件監聽器(Event Listener)
一個「事件監聽器」則負責在監聽到事件時處理(Handle)事件。
註冊(Registration)和註銷(Cancellation)
通常來說,在全局作用域,中控負責:
在 Java 中實現
那麼在 Java 中,與 .Net 中
delegate
和event
相對應的又是什麼呢?綜上可知,
delegate
聲明定義了事件處理方法的函數簽名,那麼這對應了 Java 中的函數式接口(Functional Interface):那麼
event
呢?經觀察,我們可推定,.Net 中的event
聲明了一個集合(由+=
和-=
操作符推測),而其元素為SampleEventHandler
委託類型:那麼,接下來我們只需要依樣畫葫蘆就好了:
事件監聽目標(Event Target)
事件監聽器(Event Listener)
註冊(Registration)和註銷(Cancellation)
總結
本篇實現的思路中最反直覺的地方有兩處:
Lambda 表達式
Java 8 新增了 lambda 表達式以觸發現有的方法,因此上面 Java 中的
實際上是
的語法糖。
方法引用(Method References)
Java 8 中還新增了「方法引用(Method References)」,因此我們完全可以擺脫
ISampleEventHandler
實現的強制性,直接註冊與ISampleEventHandler
有相同函數簽名的方法即可。參見
The text was updated successfully, but these errors were encountered: