本發(fā)明涉及消息傳遞領域,尤其涉及一種事件傳遞的方法及系統(tǒng)。
背景技術:
現(xiàn)有技術中,功能模塊間的事件通知傳遞方法主要有以下兩種:一種是預先設置模塊間的回調函數(shù)。由于回調函數(shù)是靜態(tài)函數(shù)或全局函數(shù),而且函數(shù)原型都是固定的,這樣導致了事件參數(shù)和類對象的傳遞變得非常局限,實現(xiàn)過程麻煩且代碼可讀性差;另一種是利用類接口或者類成員函數(shù)委托的方式進行事件傳遞,這種雖然解決了前者的問題,但是這些方式都是直接把類實例和成員函數(shù)直接以委托的方式交給調用者,也就是說調用者在回調委托的時候,需要關心該委托對象是否被銷毀,導致模塊間的維護變得很麻煩。而且不管前者還是后者,隨著越來越多的業(yè)務邏輯需要處理,模塊存在大量的消息通信,這些導致嚴重的代碼耦合問題。
申請?zhí)枮?01410551054.7的專利文獻《基于事件總線的模塊間消息傳遞機制》公開了一種不同功能模塊間的消息傳遞方法,通過在訂閱者類中實現(xiàn)各種事件的訂閱函數(shù)并進行標注,訂閱者向事件總線注冊事件;事件總線進行事件注冊后,通過反射機制找出注冊對象中被標注的訂閱函數(shù),生成訂閱者對象;以訂閱事件為key,用map來維護訂閱者信息,所述訂閱者信息包括訂閱者對象、回調事件函數(shù)及事件類型;通過反射機制分析訂閱者對象,根據(jù)回調事件函數(shù)回調的Method名字確定事件執(zhí)行方式并遍歷map進行事件分發(fā)。解決了現(xiàn)有軟件編程過程中模塊間耦合嚴重的問題。
上述基于事件總線的模塊間消息傳遞機制,雖然改善了模塊間耦合的問題,但是該方法是基于Java注解的方式,然后通過反射得到事件訂閱者的回調函數(shù),消息傳遞的效率較低。
技術實現(xiàn)要素:
本發(fā)明所要解決的技術問題是:本發(fā)明提供一種事件傳遞的方法及系統(tǒng),實現(xiàn)高效地在模塊間傳遞事件且能夠降低模塊間的耦合性。
為了解決上述技術問題,本發(fā)明采用的技術方案為:
本發(fā)明提供一種事件傳遞的方法,包括:
繼承觀察者模板類,得到觀察者類;所述觀察者模板類包括主線程觀察者模板類和工作線程觀察者模板類,繼承主線程觀察者模板類的觀察者類在主線程調用相應的被觀察事件,繼承工作線程觀察者模板類的觀察者類在工作線程調用相應的被觀察事件;
在所述觀察者類中重寫事件處理函數(shù);
創(chuàng)建觀察者鏈表;所述觀察者鏈表的ID與所述被觀察事件的ID相同;
添加與所述被觀察事件相關的觀察者類至所述觀察者鏈表;
將所述被觀察事件發(fā)送至事件隊列;所述事件隊列包括主線程事件隊列和工作線程事件隊列;
分發(fā)所述事件隊列中的所述被觀察事件給所述觀察者鏈表中的觀察者類;
所述事件處理函數(shù)處理所述被觀察事件。
本發(fā)明還提供一種事件傳遞的系統(tǒng),包括:
繼承模塊,用于繼承觀察者模板類,得到觀察者類;所述觀察者模板類包括主線程觀察者模板類和工作線程觀察者模板類,繼承主線程觀察者模板類的觀察者類在主線程調用相應的被觀察事件,繼承工作線程觀察者模板類的觀察者類在工作線程調用相應的被觀察事件;
重寫模塊,用于在所述觀察者類中重寫事件處理函數(shù);
創(chuàng)建模塊,用于創(chuàng)建觀察者鏈表;所述觀察者鏈表的ID與所述被觀察事件的ID相同;
添加模塊,用于添加與所述被觀察事件相關的觀察者類至所述觀察者鏈表;
發(fā)送模塊,用于將所述被觀察事件發(fā)送至事件隊列;所述事件隊列包括主線程事件隊列和工作線程事件隊列;
分發(fā)模塊,用于分發(fā)所述事件隊列中的所述被觀察事件給所述觀察者鏈表中的觀察者類;
處理模塊,用于所述事件處理函數(shù)處理所述被觀察事件。
本發(fā)明的有益效果在于:通過繼承觀察者模板類得到觀察者類,實現(xiàn)快速地創(chuàng)建在主線程中工作的觀察者類和在工作線程中工作的觀察者類,對于一些比較耗時的事件,在工作線程中處理能夠減少占用主線程的資源從而提高用戶體驗;根據(jù)被觀察事件重寫觀察者類中的事件處理函數(shù),該事件處理函數(shù)可直接接收被觀察事件的實例,提高了模塊間消息傳遞的效率;通過觀察者鏈表綁定被觀察事件與相關的觀察者類,一個被觀察事件可綁定多個觀察者類,通過觀察者鏈表可方便地維護被觀察事件與觀察者類之間的關系,此外,系統(tǒng)可根據(jù)觀察者鏈表將被觀察事件分發(fā)給相關的觀察者類,從而降低了模塊間的耦合性。
附圖說明
圖1為本發(fā)明一種事件傳遞的方法的流程框圖;
圖2為本發(fā)明一種事件傳遞的系統(tǒng)的結構框圖;
圖3為本發(fā)明一種事件傳遞的方法的實施例一的流程框圖;
圖4為本發(fā)明一種事件傳遞的方法的實施例二的流程框圖;
圖5為本發(fā)明一種事件傳遞的方法的實施例三的流程框圖;
標號說明:
1、繼承模塊;2、重寫模塊;3、創(chuàng)建模塊;4、添加模塊;5、發(fā)送模塊;6、分發(fā)模塊;7、處理模塊。
具體實施方式
為詳細說明本發(fā)明的技術內容、所實現(xiàn)目的及效果,以下結合實施方式并配合附圖予以說明。
本發(fā)明最關鍵的構思在于:通過繼承觀察者模板類得到觀察者類,實現(xiàn)快速地創(chuàng)建在主線程中工作的觀察者類和在工作線程中工作的觀察者類;根據(jù)被觀察事件重寫觀察者類中的事件處理函數(shù),提高了模塊間消息傳遞的效率;通過觀察者鏈表綁定被觀察事件與相關的觀察者類,使得系統(tǒng)可根據(jù)觀察者鏈表將被觀察事件分發(fā)給相關的觀察者類,從而降低了模塊間的耦合性。
請參照圖1至圖5,
如圖1所示,本發(fā)明提供一種事件傳遞的方法,包括:
繼承觀察者模板類,得到觀察者類;所述觀察者模板類包括主線程觀察者模板類和工作線程觀察者模板類,繼承主線程觀察者模板類的觀察者類在主線程調用相應的被觀察事件,繼承工作線程觀察者模板類的觀察者類在工作線程調用相應的被觀察事件;
在所述觀察者類中重寫事件處理函數(shù);
創(chuàng)建觀察者鏈表;所述觀察者鏈表的ID與所述被觀察事件的ID相同;
添加與所述被觀察事件相關的觀察者類至所述觀察者鏈表;
將所述被觀察事件發(fā)送至事件隊列;所述事件隊列包括主線程事件隊列和工作線程事件隊列;
分發(fā)所述事件隊列中的所述被觀察事件給所述觀察者鏈表中的觀察者類;
所述事件處理函數(shù)處理所述被觀察事件。
進一步地,將所述被觀察事件發(fā)送至事件隊列,具體為:
判斷所述被觀察事件是否需要在主線程處理;
若是,則將所述被觀察事件的實例發(fā)送至主線程事件隊列;否則,
將所述被觀察事件的實例發(fā)送至工作線程事件隊列。
由上述描述可知,以被觀察事件是否需要在主線程處理為依據(jù),將被觀察事件發(fā)送至主線程事件隊列或工作線程事件隊列,有利于后續(xù)對不同的被觀察事件進行不同的調度和管理。
進一步地,將所述被觀察事件發(fā)送至事件隊列,具體為:
拷貝被觀察事件的實例,得到拷貝實例;
判斷所述被觀察事件是否需要在主線程處理;
若是,則將所述拷貝實例發(fā)送至主線程事件隊列;否則,
將所述拷貝實例發(fā)送至工作線程事件隊列。
由上述描述可知,將拷貝的被觀察事件的實例發(fā)送至事件隊列,有利于防止被觀察事件的實例被銷毀后丟失重要數(shù)據(jù),提高了事件傳遞過程中的可靠性。
進一步地,分發(fā)所述事件隊列中的所述被觀察事件給所述觀察者鏈表中的觀察者類,具體為:
獲取所述主線程事件隊列中的被觀察事件的實例,得到第一事件實例;
獲取與所述第一事件實例相對應的觀察者鏈表,得到第一觀察者鏈表;
獲取第一觀察者鏈表中的觀察者類的實例,得到第一觀察者實例;
將所述第一事件實例發(fā)送給第一觀察者實例。
由上述描述可知,可將主線程事件隊列中的被觀察事件的實例發(fā)送給觀察者鏈表中記錄的相關觀察者類的實例。
進一步地,分發(fā)所述事件隊列中的所述被觀察事件給所述觀察者鏈表中的觀察者類,還包括:
獲取所述工作線程事件隊列中的被觀察事件的實例,得到第二事件實例;
獲取與所述第二事件實例相對應的觀察者鏈表,得到第二觀察者鏈表;
獲取第二觀察者鏈表中的觀察者類的實例,得到第二觀察者實例;
判斷工作線程是否處于空閑狀態(tài);
若是,則將所述第二事件實例發(fā)送給第二觀察者實例。
由上述描述可知,工作線程事件隊列中的被觀察事件一般比較耗時或占用系統(tǒng)資源大,因此,在獲得工作線程事件隊列中的被觀察事件的實例時,先判斷工作線程是否處于空閑狀態(tài),所述空閑狀態(tài)主要指是否有足夠的資源能夠處理該被觀察事件的實例,確定工作線程處于空閑狀態(tài)后,將被觀察事件的實例發(fā)送給相應的觀察者類的實例,有利于防止工作線程出現(xiàn)阻塞的情況。
進一步地,還包括:
撤銷綁定所述觀察者類與所述被觀察事件。
進一步地,所述撤銷綁定所述觀察者類與所述被觀察事件,具體為:
將所述觀察者類從與所述被觀察事件相對應的觀察者鏈表中刪除。
由上述描述可知,可撤銷綁定觀察者類和被觀察事件,提高了觀察者類和被觀察事件之間對應關系的靈活性。
如圖2所示,本發(fā)明還提供一種事件傳遞的系統(tǒng),包括:
繼承模塊1,用于繼承觀察者模板類,得到觀察者類;所述觀察者模板類包括主線程觀察者模板類和工作線程觀察者模板類,繼承主線程觀察者模板類的觀察者類在主線程調用相應的被觀察事件,繼承工作線程觀察者模板類的觀察者類在工作線程調用相應的被觀察事件;
重寫模塊2,用于在所述觀察者類中重寫事件處理函數(shù);
創(chuàng)建模塊3,用于創(chuàng)建觀察者鏈表;所述觀察者鏈表的ID與所述被觀察事件的ID相同;
添加模塊4,用于添加與所述被觀察事件相關的觀察者類至所述觀察者鏈表;
發(fā)送模塊5,用于將所述被觀察事件發(fā)送至事件隊列;所述事件隊列包括主線程事件隊列和工作線程事件隊列;
分發(fā)模塊6,用于分發(fā)所述事件隊列中的所述被觀察事件給所述觀察者鏈表中的觀察者類;
處理模塊7,用于所述事件處理函數(shù)處理所述被觀察事件。
如圖3所示,本發(fā)明的實施例一為:
繼承主線程觀察者模板類,得到觀察者類;
在所述觀察者類中重寫事件處理函數(shù);
創(chuàng)建觀察者鏈表;
添加與所述被觀察事件相關的觀察者類至所述觀察者鏈表;
判斷所述被觀察事件是否需要在主線程處理;
將所述被觀察事件的實例發(fā)送至主線程事件隊列;
獲取所述主線程事件隊列中的被觀察事件的實例,得到第一事件實例;
獲取與所述第一事件實例相對應的觀察者鏈表,得到第一觀察者鏈表;
獲取第一觀察者鏈表中的觀察者類的實例,得到第一觀察者實例;
將所述第一事件實例發(fā)送給第一觀察者實例;
所述第一觀察者實例中的事件處理函數(shù)處理所述第一事件實例。
由上述描述可知,本發(fā)明的實施例一實現(xiàn)了將被觀察事件的實例傳遞給相關的觀察者類的實例,并且觀察者類的實例中的事件處理函數(shù)在主線程處理該被觀察事件的實例。
如圖4所述,本發(fā)明的實施例二為:
繼承主線程觀察者模板類,得到觀察者類;
在所述觀察者類中重寫事件處理函數(shù);
創(chuàng)建觀察者鏈表;
添加與所述被觀察事件相關的觀察者類至所述觀察者鏈表;
拷貝被觀察事件的實例,得到拷貝實例;
判斷所述被觀察事件是否需要在主線程處理;
將所述拷貝實例發(fā)送至主線程事件隊列;
獲取所述主線程事件隊列中的拷貝實例,得到第一事件實例;
獲取與所述第一事件實例相對應的觀察者鏈表,得到第一觀察者鏈表;
獲取第一觀察者鏈表中的觀察者類的實例,得到第一觀察者實例;
將所述第一事件實例發(fā)送給第一觀察者實例;
所述第一觀察者實例中的事件處理函數(shù)處理所述第一事件實例。
由上述描述可知,與本發(fā)明的實施例一相比,本發(fā)明的實施例二先拷貝被觀察事件的實例,并將被觀察事件的拷貝實例發(fā)送給主線程事件隊列,從而有效地防止了應不當操作或意外事件銷毀被觀察事件的實例,而丟失重要數(shù)據(jù),提高了事件傳遞過程中的可靠性。
如圖5所示,本發(fā)明的實施例三為:
繼承工作線程觀察者模板類,得到觀察者類;
在所述觀察者類中重寫事件處理函數(shù);
創(chuàng)建觀察者鏈表;
添加與所述被觀察事件相關的觀察者類至所述觀察者鏈表;
判斷所述被觀察事件是否需要在主線程處理;
將所述被觀察事件的實例發(fā)送至工作線程事件隊列;
獲取所述工作線程事件隊列中的被觀察事件的實例,得到第二事件實例;
獲取與所述第二事件實例相對應的觀察者鏈表,得到第二觀察者鏈表;
獲取第二觀察者鏈表中的觀察者類的實例,得到第二觀察者實例;
判斷工作線程是否處于空閑狀態(tài);
若是,則將所述第二事件實例發(fā)送給第二觀察者實例;
所述第二觀察者實例中的事件處理函數(shù)處理所述第二事件實例。
由上述描述可知,與本發(fā)明的實施例一相比,本實施例中的被觀察事件需要在工作線程中處理,由于此類被觀察事件通常較耗時或占用資源量大,因此先判斷相應的工作線程是否處于空閑狀態(tài),再將此類被觀察事件的實例發(fā)送給相應的觀察者類的實例。這樣做能夠減輕主線程的負擔,加快重要事件的處理過程,從而提高用戶體驗。
本發(fā)明的實施例四為:
本實施例的應用場景為:用戶通過賬號和密碼登錄到帳號中心,登錄完成后,當前界面顯示昵稱,頭像等個人信息。
該應用場景中包含兩個被觀察事件,它們是:登錄請求事件和個人信息獲取事件。該應用場景中還包含兩個觀察者類,它們是:用戶中心觀察者類和界面展示觀察者類。其中,用戶中心觀察者類觀察登錄請求事件,登錄請求事件獲取用戶的用戶名和密碼,用戶中心觀察者類根據(jù)用戶名和密碼進行登錄操作;界面展示觀察者類觀察個人信息獲取事件,當用戶登錄成功后,個人信息獲取事件獲取用戶的用戶ID、昵稱和頭像路徑,界面展示觀察者類根據(jù)用戶ID、昵稱和頭像路徑展示界面。
在用戶中心觀察者類中重寫事件處理函數(shù),由于登錄操作需在主線程完成,故該用戶中心觀察者類繼承自主線程觀察者模板類,用于處理登錄請求事件的實例。綁定用戶中心觀察者類和登錄請求事件,具體為:查找是否有與登錄請求事件ID一致的觀察者鏈表ID,若有,則直接將用戶中心觀察者類插入該觀察者鏈表中,否則,以登錄請求事件ID為觀察者鏈表的ID,創(chuàng)建一個新的觀察者鏈表,并將用戶中心觀察者類插入到該觀察者鏈表中。由于用戶的用戶名和密碼信息較為重要,不可丟失,故先拷貝登錄請求事件的實例,再將登錄請求事件的拷貝實例通過Windows操作系統(tǒng)特有的窗口消息機制發(fā)送至主線程事件隊列中。將登錄請求事件的拷貝實例發(fā)送給用戶中心觀察者類,調用用戶中心觀察者類的事件處理函數(shù)處理登錄請求事件的拷貝實例,執(zhí)行登錄操作。若要撤銷綁定用戶中心觀察者類與登錄請求事件,則將用戶中心觀察者類從與登錄請求事件相對應的觀察者鏈表中刪除。
在界面展示觀察者類中重寫事件處理函數(shù),由于界面展示操作比較耗時,故在工作線程中完成該操作,因此該界面展示觀察者類繼承自工作線程觀察者模板類,用于處理個人信息獲取事件的實例。將界面展示觀察者類添加至與個人信息獲取事件相應的觀察者鏈表中。通過Windows操作系統(tǒng)特有的窗口消息機制將個人信息獲取事件的實例發(fā)送至工作線程事件隊列中。待相應的工作線程處于空閑狀態(tài),將個人信息獲取事件的實例發(fā)送給界面展示觀察者類,調用界面展示觀察者類的事件處理函數(shù)處理個人信息獲取事件的實例,展示界面。
由上述描述可知,本實施例通過觀察者鏈表綁定登錄請求事件和用戶中心觀察者類,個人信息獲取事件和界面展示觀察者類,從而降低了事件與觀察者類之間的耦合性;另,可通過將觀察者類從相應事件對應的觀察者鏈表中刪除解除觀察者類和事件的綁定關系,提高了觀察者類與事件間對應關系的靈活性。
綜上所述,本發(fā)明提供的一種事件傳遞的方法及系統(tǒng),通過繼承觀察者模板類得到觀察者類,實現(xiàn)快速地創(chuàng)建在主線程中工作的觀察者類和在工作線程中工作的觀察者類,對于一些比較耗時的事件,在工作線程中處理能夠減少占用主線程的資源從而提高用戶體驗;根據(jù)被觀察事件重寫觀察者類中的事件處理函數(shù),該事件處理函數(shù)可直接接收被觀察事件的實例,提高了模塊間消息傳遞的效率;通過觀察者鏈表可方便地維護被觀察事件與觀察者類之間的關系,且系統(tǒng)可根據(jù)觀察者鏈表將被觀察事件分發(fā)給相關的觀察者類,從而降低了模塊間的耦合性;進一步地,使用不同的事件隊列接收需要在主線程中處理的被觀察事件的實例和需要在工作線程中處理的被觀察事件的實例,有利于后續(xù)對不同的被觀察事件實例進行不同的調度和管理;進一步地,拷貝被觀察事件的實例,有利于防止被觀察事件的實例被銷毀后丟失重要數(shù)據(jù),提高了事件傳遞過程中的可靠性;進一步地,在獲得工作線程事件隊列中的被觀察事件的實例時,先判斷工作線程是否處于空閑狀態(tài),確定工作線程處于空閑狀態(tài)后,將被觀察事件的實例發(fā)送給相應的觀察者類的實例,有利于防止工作線程出現(xiàn)阻塞的情況;進一步地,可撤銷綁定觀察者類和被觀察事件,提高了觀察者類和被觀察事件之間對應關系的靈活性。
以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內容所作的等同變換,或直接或間接運用在相關的技術領域,均同理包括在本發(fā)明的專利保護范圍內。