博客 / 詳情

返回

事件系統的設計與實現

引述

本文會講述以下幾個內容:

  1. 事件系統有什麼用
  2. 什麼情況下會使用事件
  3. 如何去設計一個事件系統
  4. 如何使用一個事件系統

事件系統有什麼用

事件系統的好處有很多,其中最主要的是用於模塊之間的解耦,以及各個內容之間的解耦。

在開發過程中一定會存在一個模塊需要依賴另一個模塊的一些數據和狀態,從而執行自身邏輯的情況。

在這種情況下,依賴其他模塊的一些狀態和數據,那麼正常的做法就是引用對方模塊,從而拿到對應的數據和狀態,然後執行對應的操作。如果另一個模塊沒有這些數據那麼我們這個模塊是不是就無法運行了。

事件系統可以讓模塊之間的依賴簡化為對事件系統的依賴,那麼模塊之間的依賴就從原本的n-n變成了,n-1的依賴。

事件系統是什麼?怎麼解耦?

那麼事件系統是如何達到解耦的效果的?

事件系統就相當於是一個管理中心,負責管理各種事件的發生,以及發生之後要做什麼。

事件系統相當於是在各個模塊事件依賴鏈接中的一箇中介,橋樑。事件的觸發者經過事件系統分發到各個模塊,事件的接收者通過事件系統監聽各個模塊發出的事件。因此各個模塊需要關心的只有事件系統,而非各個模塊。

一開始各個模塊之間是相互依賴,有的模塊即使事件的觸發者就是事件的接收者,就會導致模塊之間依賴混亂,例如:

使用事件系統之後,各個模塊之間的依賴關係是這樣的:

從上圖可以發現,不管是事件的觸發者,還是事件的監聽者,都從原本的需要跟多個模塊進行依賴,到只需要依賴事件系統即可。

事件的觸發者將事件發送給事件系統,事件系統再將事件的發生轉發給各個監聽者。事件的觸發者不需要關注誰監聽了該事件,而事件的監聽者也不需要關注誰觸發的該事件,雙方都只需要關注自己的業務即可。

什麼時候會使用事件系統?

當一個模塊需要依賴另一個模塊的一個狀態或者時機的時候,就可以使用事件系統。

場景就是:當 .... 發生時就 ...

使用的方式就是,當 ... 發生時就告訴事件系統,事件系統知道之後就執行 ...

如何設計事件系統?

一個事件系統應該具有以下的特點

  1. 事件系統應該只有一個。(因為事件系統的目的就是集中管理,讓各個模塊只依賴一個事件系統,因此事件系統應該是全局唯一的,使用單例模式)
  2. 事件系統應該是獨立的不依賴與業務模塊(由於不管是事件的監聽者還是觸發者都會依賴於事件系統,因此事件系統應該是獨立於具體業務的,不依賴於具體業務模塊)
  3. 事件的觸發和監聽應該是一對多的
  4. 事件系統應該具有分發和映射功能,對應的事件觸發,能夠映射到對應的監聽者列表,並且將這個事件分發給各個監聽者。

因此事件的和對應的監聽的關係應該是這樣的:

通過上面的梳理,可以發現事件系統使用的就是觀察者模式進行設計的。使用者中設計模式,可以讓觸發者和監聽者之間相互解耦。

如何使用一個事件系統?

一個事件系統正常回頭兩個接口:

  1. 監聽綁定事件的接口 bindEvent(Event,callBack)
  2. 觸發事件的接口 fire(Event)

監聽綁定的接口是給監聽者(觀察者)進行調用的,通過調用這個接口可以監聽指定的事件,當事件觸發的時候通過指定的callBack 回調通知自己。

觸發事件的接口是給事件的觸發者進行調用的,當事件觸發的時候需要主動的調用通知事件系統,進行分發。

因此使用事件系統只需要兩個步驟:

  1. 被依賴的模塊上調用fire 觸發事件
  2. 依賴的模塊上使用bindEvnet 綁定對應的事件,指定對應的回調

剩下的交給事件系統即可。事件系統會在被依賴模塊執行fire的時候,執行依賴模塊bind的回調內容。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.