JDK的事件發佈監聽機制

什麼是事件監聽機制?

在講解事件監聽機制前,我們先回顧下設計模式中的觀察者模式,因為事件監聽機制可以說是在觀察者模式基礎上的進一步抽象和改進。我們可以在JDK或者開源框架中比如spring,dubbo中看到它的身影,從這個意義上說事件監聽機制可以看做一種傳統觀察者模式的具體實現,不同框架對其實現方式會有些差別。

JDK的事件發佈監聽機制

典型的觀察者模式將有依賴關係的對象抽象為觀察者和主題兩個不同的角色,多個觀察者同時觀察一個主題,兩者通過抽象接口保持松耦合狀態,這樣雙方可以相對獨立的進行擴展和變化。比如可以很方便的增刪觀察者,修改觀察者中的更新邏輯而不用修改主題中的代碼。但是這種解耦進行的不徹底,具體體現在以下幾個方面。

  1. 抽象主題需要依賴抽象觀察者,而這種依賴關係完全可以去除。
  2. 主題需要維護觀察者列表,並對外提供動態增刪觀察者的接口。
  3. 主題狀態改變時需要由自己去通知觀察者進行更新。

我們可以把主題(subject)替換成事件(event),把對特定主題進行觀察的觀察者(observer)替換成對特定事件進行監聽的監聽器(EventLister),而把原有主題中負責維護主題與觀察者映射關係以及在自身狀態改變時通知觀察者的職責從中抽出,放入一個新的角色事件發佈器(EventPublisher)中,事件監聽模式的輪廓就展現在我們面前。

常見事件監聽機制的主要角色如下:

  1. 事件及事件源:對應於觀察者模式中的主題。事件源發生某事件是特定事件監聽器被觸發的原因。
  2. 事件監聽器:對應於觀察者模式中的觀察者。監聽器監聽特定事件,並在內部定義了事件發生後的響應邏輯。
  3. 事件發佈器:事件監聽器的容器,對外提供發佈事件和增刪事件監聽器的接口,維護事件和事件監聽器之間的映射關係,並在事件發生時負責通知相關監聽器。
JDK的事件發佈監聽機制

JDK中對事件監聽機制的支持

JDK為用戶實現自定義事件監聽提供了兩個基礎的類。一個是代表所有可被監聽事件的事件基類java.util.EventObject,所有自定義事件類型都必須繼承該類。

該類內部有一個Object類型的source變量,邏輯上表示該事件的事件源,實際上可以用來存儲包含該事件的一些相關信息。

另一個則是對所有事件監聽器進行抽象的接口java.util.EventListener。這是一個標記接口,內部沒有任何抽象方法。所有自定義事件監聽器都必須實現該標記接口。

以上就是JDK為我們實現自定義事件監聽提供的底層支持。針對具體業務場景,我們通過擴展java.util.EventObject來自定義事件類型,同時通過擴展java.util.EventListener來定義在特定事件發生時被觸發的事件監聽器。當然不要忘了還要定義一個事件發佈器來管理事件監聽器並提供發佈事件的功能。

基於JDK要實現對自定義事件的監聽還是比較麻煩的,要做的工作比較多。而且自定義的事件發佈器也不能提供對所有事件的統一發布支持。


分享到:


相關文章: