事件/消息派發器

項目工程中經常使用事件/消息派發以及消息回調機制,最近在工作中我遇到了事件派發器的一點小問題在此記錄以備之後再次使用。


一. 事件派發器需求:  

A類爲一個數據功能集合 其包含很多屬性 A.a A.b A.c,每個屬性又包含很多子屬性 依次。。  要求任意屬性或者其子屬性發生變化時刷新/調用B類一個回調方法。


二. 實現方式一 --------------------------全局消息/事件管理器


採用觀察者模式實現一個全局事件管理器。

1. 觀察者模式基本原理: 所謂觀察者模式也就是某一主題保存所有關心此主題的所有觀察者信息 ,當主題出現時通知所有觀察者。

   

         當各種屬性發生變化時所需要做出反應的類作爲一個觀察者/偵聽者  在所有屬性發生變化時派發消息事件從而完成對屬性變化消息的偵聽。


注: 簡單的全局消息派發存在一個缺陷即偵聽者/觀察者一旦被註冊將會無條件執行消息回調,例如有兩個B類的對象b1 b2都註冊了事件回調,當a1屬性變化時會拋出事件此時b1 b2均響應回調而我們此時可能只想b1對象響應。(當然此問題可以通過增加優先級 增加定向消息派發等機制解決 但無疑會增加其複雜性)


三. 實現方式二 --------------------------消息冒泡

爲了解決全局消息派發不能指定偵聽對象這一缺陷,我借鑑AS3消息冒泡機制實現這一消息向上傳遞的需求。

冒泡機制:

as3的事件過程包括三個階段 捕獲,目標和冒泡階段。下面我舉一個很簡單的例子來說明冒泡機制。舞臺stage上有一個元件mc,mc上有一個子按鈕元件btn.



捕獲階段:鼠標在btn上發出點擊事件。首先捕獲該事件的是stage,然後向下傳遞到mc,再到btn
目標階段:找到鼠標的最底層的目標btn,如果它註冊了監聽函數,就執行該監聽函數了
冒泡階段:開始冒泡,自底向上。從btn到mc,最後到stage

 也就是說當點擊事件觸發時btn會先捕獲此事件 處理後向上層的mc派發 之後再向stage派發


類似的我將A的各個屬性及每個屬性的子屬性作爲(stage -- mc -- btn)任何屬性變化時都會向上冒泡 在A類中提供註冊冒泡消息回調的方法(調用B類的事件觸發),這樣就可以保證指定目標的消息派發。


注: 此種方式只針對偵聽者只有一個且要區分指定目標的消息派發時較爲好用,與全局消息派發互補.


發佈了25 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章