一種基于事件驅動的編輯器系統(tǒng)及方法
【專利摘要】本發(fā)明涉及一種基于事件驅動的編輯器系統(tǒng),該系統(tǒng)包括啟動模塊、驅動模塊以及監(jiān)聽模塊,其中:啟動模塊初始化事件驅動模塊及對象模塊;驅動模塊接收一個或多個事件,所述事件由用戶對系統(tǒng)的操作產生;驅動模塊將所述事件傳遞給系統(tǒng)中的對象模塊;監(jiān)聽模塊位于所述對象模塊中,當監(jiān)聽模塊監(jiān)聽到事件產生時,根據所述對象模塊內部的實現邏輯處理事件。此外,本發(fā)明還涉及一種基于事件驅動的編輯器方法。本發(fā)明的有益效果在于,系統(tǒng)中的各個對象模塊之間沒有直接調用關系,所有對象模塊都只與事件驅動模塊傳遞信息和命令,提高了整個系統(tǒng)應對需求變化的能力,具有更高的靈活性和擴展性。
【專利說明】
一種基于事件驅動的編輯器系統(tǒng)及方法
【技術領域】
[0001]本發(fā)明涉及計算機領域,尤其涉及一種基于事件驅動的編輯器系統(tǒng)及方法。
【背景技術】
[0002]編輯器是一類所見即所得的編輯計算機文件的軟件的統(tǒng)稱,例如,文本編輯器用于編輯/修改文字、圖片編輯器用于編輯/修改圖片、3D模型編輯器用于編輯/修改3D虛擬模型等。目前編輯器系統(tǒng)的開發(fā)技術通常按照功能需求或業(yè)務邏輯將系統(tǒng)拆分成各個模塊,由每一個模塊負責某一特定的功能。但是,大多數模塊需要與多個其他模塊進行交互才能實現,這往往通過由一個模塊向另一個模塊直接發(fā)送消息或命令,或者是在模塊內部直接調用另一模塊的功能實現,這會導致模塊之間的耦合,表現為不同模塊之間的直接調用關系。例如,A模塊產生某事件,該事件向模塊B發(fā)送信息,從而觸發(fā)模塊B實現某個動作??梢院苊黠@地得出,在模塊B中肯定存在一個監(jiān)聽段,該監(jiān)聽段監(jiān)聽A模塊產生的該事件。如果由于系統(tǒng)需求,用實現等同功能的改進的C模塊替代A模塊,則需要相應地對模塊B進行修改,從而監(jiān)聽C模塊。因此,A、C模塊與B模塊的耦合關系限制了整體系統(tǒng)的擴展性。因此,當模塊功能需求發(fā)生變化時,或者根據需求需要增加新的模塊時,就不得不改變其他與之交互的模塊的內部邏輯實現。這種耦合和調用關系極大地限制了系統(tǒng)的靈活性和擴展性。
[0003]因此,需要一種技術,可以在實現上述模塊之間交互的前提下,減少或者消除模塊之間的耦合,從而降低模塊構建時需要考慮多個相關模塊的復雜性,同時提高整體系統(tǒng)的靈活性和擴展性。
【發(fā)明內容】
[0004]為了減少或者消除系統(tǒng)各模塊之間的耦合,提高整體系統(tǒng)的靈活性和擴展性,本發(fā)明提供了一種基于事件驅動的編輯器系統(tǒng),該系統(tǒng)包括啟動模塊、驅動模塊以及監(jiān)聽模塊,其中:
啟動模塊初始化事件驅動模塊及對象模塊;
驅動模塊接收一個或多個事件,所述事件由用戶對系統(tǒng)的操作產生;驅動模塊將所述事件傳遞給系統(tǒng)中的對象模塊;
監(jiān)聽模塊位于所述對象模塊中,當監(jiān)聽模塊監(jiān)聽到事件產生時,根據所述對象模塊內部的實現邏輯處理事件。
[0005]有益地,每個所述對象模塊均具有事件監(jiān)聽模塊;驅動模塊要創(chuàng)建一個或多個事件廣播器,每個事件廣播器內部維護一個事件監(jiān)聽模塊列表。
[0006]有益地,驅動模塊根據事件廣播器內的事件監(jiān)聽模塊列表,將事件主動推送給對象模塊,其中所述對象模塊的監(jiān)聽模塊包含在該事件監(jiān)聽模塊列表內。
[0007]有益地,驅動模塊將所述事件傳遞給系統(tǒng)中的對象模塊之前,首先通過廣播方式詢問相關模塊是否允許該所述事件發(fā)生,如果允許,則傳遞所述事件,如果不允許,則不會傳遞所述事件。
[0008]有益地,在所述驅動模塊退出之前,每個對象模塊必須首先不再監(jiān)聽事件,然后銷毀事件監(jiān)聽模塊。
[0009]本發(fā)明還涉及一種基于事件驅動的編輯器方法,該方法包括:
1)分別初始化事件驅動模塊及對象模塊;
2)驅動模塊首先接收一個或多個事件,其中所述事件由用戶對系統(tǒng)的操作產生;然后將所述事件傳遞給系統(tǒng)中的對象模塊;
3)當位于對象模塊內的監(jiān)聽模塊監(jiān)聽到事件產生時,根據所述對象模塊內部的實現邏輯處理事件。
[0010]有益地,在步驟I)中,初始化對象模塊步驟中,每個所述對象模塊均創(chuàng)建事件監(jiān)聽模塊;并且對應地,初始化事件驅動模塊步驟中,事件驅動模塊要創(chuàng)建一個或多個事件廣播器,其中每個事件廣播器內部維護一個事件監(jiān)聽模塊列表。
[0011]有益地,在步驟2)中,驅動模塊通過事件廣播器內的事件監(jiān)聽模塊列表,將事件主動推送給對象模塊,所述對象模塊的監(jiān)聽模塊包含在該事件監(jiān)聽模塊列表內。
[0012]有益地,在步驟2)中,驅動模塊將所述事件傳遞給系統(tǒng)中的對象模塊之前,通過廣播方式詢問相關模塊是否允許該所述事件發(fā)生,如果允許,則傳遞所述事件,如果不允許,則不會傳遞所述事件。
[0013]其中,該方法還包括退出步驟4),在驅動模塊退出之前,每個對象模塊必須首先不再監(jiān)聽事件,然后銷毀事件監(jiān)聽模塊。
[0014]本發(fā)明的有益效果在于:系統(tǒng)中的各個對象模塊之間沒有直接調用關系,所有對象模塊都只與事件驅動模塊傳遞信息和命令。從而模塊與模塊之間的調用關系更改為模塊與事件驅動模塊之間的調用關系。當系統(tǒng)的需求發(fā)生變化時,或者需要增加新的模塊時,可以不用修改其他模塊內部的邏輯實現,只需要修改某一個模塊的邏輯實現,并且將實現新需求的模塊加入到事件驅動模塊的監(jiān)聽模塊管理列表中。本發(fā)明提高了整個系統(tǒng)應對需求變化的能力,具有更高的靈活性和擴展性。
【專利附圖】
【附圖說明】
[0015]下面結合附圖對本發(fā)明的具體實施例進行更詳細的說明,其中:
圖1所示為根據本發(fā)明一實施例,只需要創(chuàng)建一個事件廣播器的事件驅動模塊的示意圖;
圖2所示為根據本發(fā)明另一實施例,為不同種類的事件創(chuàng)建不同的事件廣播器的事件驅動模塊的示意圖。
【具體實施方式】
[0016]本發(fā)明一實施例中,涉及到的對象模塊分別包括字體控制模塊、視圖模塊、窗口自適應模塊以及其他模塊。當字體控制模塊對文字的大小、字體、顏色等進行調整時,視圖模塊要根據字體的調整結果實時改變;同樣地,窗口自適應模塊應該根據字體的大小調整行字數、根據字體的顏色適應性地調節(jié)窗口的亮度等。
[0017]這里需要說明的一點是:文中所述的對象模塊是指按照功能需求或業(yè)務邏輯將系統(tǒng)拆分成的各個模塊,其中每一個模塊負責某一特定的功能。
[0018]現有技術通常采用的技術手段是:視圖模塊和容器自適應模塊等對字體控制模塊進行監(jiān)聽。字體控制模塊一旦對字體的大小、字體、顏色等進行調整時,就會向視圖模塊和容器自適應模塊等發(fā)出事件(或者稱為命令),在視圖模塊和容器自適應模塊等接收到事件后,再根據其內部的實現邏輯處理事件。然而這樣處理的具體缺陷在于,一旦對字體控制模塊進行更改,視圖模塊和容器自適應模塊等就無法監(jiān)聽到該事件,除非視圖模塊和容器自適應模塊也做出相應的適應性修改。因此,這種處理方式大大限制了整體系統(tǒng)的擴展性。
[0019]而本發(fā)明涉及的一種基于事件驅動的編輯器系統(tǒng)可以解決上述問題。該系統(tǒng)包括啟動模塊、驅動模塊以及監(jiān)聽模塊,其中:
該系統(tǒng)首先利用啟動模塊對驅動器模塊和對象模塊進行初始化。具體初始化方式如下:
在驅動模塊中,創(chuàng)建一個或多個事件廣播器,在廣播器內維護有一個事件監(jiān)聽模塊列表。對于對象模塊,為每個對象模塊創(chuàng)建唯一的事件監(jiān)聽模塊。
[0020]事件廣播器用于對事件進行廣播,其中事件驅動模塊對事件可以有兩種廣播方式,一種如圖1所示,將所有事件同等對待,那么事件驅動模塊只需要創(chuàng)建一個事件廣播器,事件會通過唯一的事件廣播器進行廣播。很明顯地,這樣處理的優(yōu)點在于只需創(chuàng)建一個事件廣播器,創(chuàng)建過程較簡單。另一種如圖2所示,可以根據事件的特性進行分類,例如為不同種類的事件創(chuàng)建不同的事件廣播器,那么事件驅動模塊需要根據事件分類的數量創(chuàng)建多個事件廣播器,每個事件廣播器負責廣播屬于該種類的一類事件,這樣做的優(yōu)勢在于,每一個事件廣播器都可以具有針對性地創(chuàng)建自己的事件監(jiān)聽模塊列表,不需要監(jiān)聽大量本不屬于自己監(jiān)聽范圍的事件。
[0021]在本實施例中,驅動模塊創(chuàng)建多個事件廣播器(1,2……η)。而事件廣播器I主要負責屬于顯示類的事件,事件廣播器內部維護的事件監(jiān)聽模塊列表包括字體控制模塊、視圖模塊以及窗口自適應模塊。同時字體控制模塊、視圖模塊、窗口自適應模塊分別創(chuàng)建一個事件監(jiān)聽模塊。
[0022]當用戶對字體的大小、顏色、字體等進行修改后,該事件被驅動模塊接收,其中該事件附帶能夠完整表示該事件的所有信息,除包括修改后的字體的大小、顏色、字體等,優(yōu)選地,還包括修改前的大小、顏色、字體等。驅動模塊接收到該事件后,根據事件的種類將該事件分配到事件廣播器I中。然后根據事件廣播器I內的事件監(jiān)聽模塊列表,向所有包含事件監(jiān)聽模塊列表內的其中一個監(jiān)聽模塊的對象模塊主動推送事件。對象模塊可以根據具體的事件信息結合模塊的實現邏輯處理事件。例如,系統(tǒng)中有一個模塊專門負責計算圖元的面積并通過界面展示,當該模塊的監(jiān)聽模塊監(jiān)聽到圖元的長、寬、形狀等數據發(fā)生改變時,則可以重新計算圖元的面積并顯示,而當監(jiān)聽到字體發(fā)生改變時,則忽略該事件。
[0023]另外,當用戶觸發(fā)另一與顯示類事件無關的事件,例如數據管理模塊僅保留近一個月的歷史記錄,對更久的歷史記錄數據進行清除。當驅動模塊接收到該事件后,可以確定該事件不屬于顯示類事件,因此不會將其分配到事件廣播器I中廣播,從而事件廣播器I內的事件監(jiān)聽模塊列表中對應的對象模塊(即該對象模塊的事件監(jiān)聽模塊存儲在該事件廣播器的事件監(jiān)聽模塊列表中)也不會通過事件廣播器I監(jiān)聽到該事件。如果驅動模塊只創(chuàng)建一個事件廣播器,則當驅動模塊接收到該事件后,必須將其分配到唯一的事件廣播器中廣播。每個事件廣播器內僅維護唯一的事件監(jiān)聽模塊列表,因此,數據控制模塊、字體控制模塊、視圖模塊、窗口自適應模塊以及其他模塊的事件監(jiān)聽模塊共享一個事件監(jiān)聽模塊列表,最終導致字體控制模塊、視圖模塊、窗口自適應模塊不得不監(jiān)聽與之無關的數據控制模塊產生的事件。
[0024]在一優(yōu)選實施例中,驅動模塊將事件傳遞給對象模塊之前,首先通過廣播方式詢問相關模塊是否允許所述事件發(fā)生,如果允許,則傳遞所述事件,如果不允許,則不會傳遞所述事件。這里的相關模塊是指與事件監(jiān)聽模塊列表內對應的對象模塊相關的模塊。例如,當驅動模塊將三角形的三條邊的邊長信息傳遞給圖形處理模塊之前,首先通過廣播方式詢問數學邏輯判斷模塊,該三條邊的邊長信息是否符合數學邏輯。例如,三條邊的邊長分別為4Cm、5Cm、12Cm,那么在將該信息傳遞給圖形處理模塊之前,首先應該由數學邏輯判斷模塊判斷其是否符合數學邏輯,由于三角形的任意兩條邊的和不能大于第三邊,因此判斷結果為不符合,不應傳遞該事件?;蛘?,三條邊的邊長分別為4Cm、5Cm、6Cm,則判斷結果為符合,如果該事件通過了數學邏輯判斷模塊以其他模塊的允許,則傳遞該事件。
[0025]需要注意的一點是,在所述驅動模塊退出之前,每個對象模塊必須首先不再監(jiān)聽事件,然后銷毀事件監(jiān)聽模塊。換言之,在系統(tǒng)退出過程中,每個對象模塊首先將自己的事件監(jiān)聽模塊從事件層的監(jiān)聽列表中移除出去,表示不再需要監(jiān)聽事件,然后銷毀事件監(jiān)聽模塊,最后再退出模塊。如果驅動模塊先退出的話,則在驅動模塊退出之后,對象模塊退出之前這段時間,模塊A發(fā)出的事件,無法通過驅動模塊傳遞到模塊B,這有可能帶來不良的后果。
[0026]此外,本發(fā)明還涉及一種基于事件驅動的編輯器方法,該方法包括:
I)初始化事件驅動模塊及對象模塊,初始化步驟如下:
在驅動模塊中,創(chuàng)建一個或多個事件廣播器,在廣播器內維護有一個事件監(jiān)聽模塊列表。對于對象模塊,為每個對象模塊創(chuàng)建一個事件監(jiān)聽模塊。
[0027]事件廣播器用于對事件進行廣播,其中事件驅動模塊對事件可以有兩種廣播方式,一是將所有事件同等對待,那么事件驅動模塊只需要創(chuàng)建一個事件廣播器,事件會通過唯一的事件廣播器進行廣播。很明顯地,這樣處理的優(yōu)點在于只需創(chuàng)建一個事件廣播器,創(chuàng)建過程較簡單。二是可以根據事件的特性進行分類,例如為不同種類的事件創(chuàng)建不同的事件廣播器,那么事件驅動模塊需要根據事件分類的數量創(chuàng)建多個事件廣播器,每個事件廣播器負責廣播屬于該種類的一類事件,這樣做的優(yōu)勢在于,每一個事件廣播器都可以具有針對性地創(chuàng)建自己的事件監(jiān)聽模塊列表,不需要監(jiān)聽大量本不屬于自己監(jiān)聽范圍的事件。
[0028]在本實施例中,驅動模塊創(chuàng)建多個事件廣播器(1,2……η)。而事件廣播器I主要負責屬于顯示類的事件,事件廣播器內部維護的事件監(jiān)聽模塊列表包括字體控制模塊、視圖模塊、窗口自適應模塊。同時字體控制模塊、視圖模塊、窗口自適應模塊分別創(chuàng)建一個事件監(jiān)聽模塊。
[0029]2)驅動模塊接收一個或多個事件,其中所述事件由用戶對系統(tǒng)的操作產生;驅動模塊將所述事件傳遞給系統(tǒng)中的對象模塊。具體步驟如下:
當用戶對字體的大小、顏色、字體等進行修改后,該事件被驅動模塊接收,其中該事件附帶能夠完整表示該事件的所有信息,除包括修改后的字體的大小、顏色、字體等,優(yōu)選地,還包括修改前的大小、顏色、字體等。驅動模塊接收到該事件后,根據事件的種類將該事件分配到事件廣播器I中。然后根據事件廣播器I內的事件監(jiān)聽模塊列表,向所有包含事件監(jiān)聽模塊列表內的監(jiān)聽模塊的對象模塊主動推送事件。
[0030]在一優(yōu)選實施例中,驅動模塊將事件傳遞給對象模塊之前,首先通過廣播方式詢問相關模塊是否允許該所述事件發(fā)生,如果允許,則傳遞所述事件,如果不允許,則不會傳遞所述事件。這里的相關模塊是指與事件監(jiān)聽模塊列表內對應的對象模塊相關的模塊。例如,當驅動模塊將三角形的三條邊的邊長信息傳遞給圖形處理模塊之前,首先通過廣播方式詢問數學邏輯判斷模塊,該三條邊的邊長信息是否符合數學邏輯。例如,三條邊的邊長分別為4Cm、5Cm、12Cm,那么在將該信息傳遞給圖形處理模塊之前,首先應該由數學邏輯判斷模塊判斷其是否答數學邏輯,由于三角形的任意兩條邊的和不能大于第三邊,因此判斷結果為不符合。因此,不應傳遞該事件?;蛘撸龡l邊的邊長分別為4Cm、5Cm、6Cm,則判斷結果為符合,如果該事件通過了數學邏輯判斷模塊以其他等同作用的模塊的允許,則傳遞該事件。
[0031]3)當位于對象模塊內的監(jiān)聽模塊監(jiān)聽到事件產生時,根據所述對象模塊內部的實現邏輯處理事件。
[0032]在一實施例中,系統(tǒng)中有一個模塊專門負責計算圖元的面積并通過界面展示,當該模塊的監(jiān)聽模塊監(jiān)聽到圖元的長、寬、形狀等數據發(fā)生改變時,則可以重新計算圖元的面積并顯示,而當監(jiān)聽到字體發(fā)生改變時,則忽略該事件。
[0033]另外,當用戶觸發(fā)另一與顯示類事件無關的事件,例如數據管理模塊僅保留近一個月的歷史記錄,對更久的歷史記錄數據進行清除。當驅動模塊接收到該事件后,可以確定該事件不屬于顯示類事件,因此不會將其分配到事件廣播器I中廣播,從而事件廣播器I內的事件監(jiān)聽模塊列表中對應的對象模塊(即該對象模塊的事件監(jiān)聽模塊存儲在該事件廣播器的事件監(jiān)聽模塊列表中)也不通過事件廣播器I監(jiān)聽到該事件。如果驅動模塊只創(chuàng)建一個事件廣播器,則當驅動模塊接收到該事件后,必須將其分配到唯一的事件廣播器中廣播。每個事件廣播器內僅維護唯一的事件監(jiān)聽模塊列表,因此,數據控制模塊、字體控制模塊、視圖模塊、窗口自適應模塊以及其他模塊的事件監(jiān)聽模塊共享一個事件監(jiān)聽模塊列表,最終導致字體控制模塊、視圖模塊、窗口自適應模塊不得不監(jiān)聽與之無關的數據控制模塊產生的事件。
[0034]在一優(yōu)選實施例中,該方法還包括4)驅動模塊的退出:在所述驅動模塊退出之前,每個對象模塊必須首先不再監(jiān)聽事件,然后銷毀事件監(jiān)聽模塊。換言之,在系統(tǒng)退出過程中,每個對象模塊首先將自己的事件監(jiān)聽模塊從事件層的監(jiān)聽列表中移除出去,表示不再需要監(jiān)聽事件,然后銷毀事件監(jiān)聽模塊,最后再退出模塊。如果驅動模塊先退出的話,則在驅動模塊退出之后,對象模塊退出之前這段時間,模塊A發(fā)出的事件,無法通過驅動模塊傳遞到模塊B,這有可能帶來不良的后果。
[0035]以上所述,只是本發(fā)明的較佳實施例而已,本發(fā)明并不局限于上述實施方式。只要其以相同的手段達到本發(fā)明的技術效果,都應屬于本發(fā)明的保護范圍。在本發(fā)明的保護范圍內其技術方案和/或實施方式可以有各種不同的修改和變化。即使個別的技術特征在不同的權利要求中引用,本發(fā)明還可包含共有這些特征的實施例。
【權利要求】
1.一種基于事件驅動的編輯器系統(tǒng),其特征在于:該系統(tǒng)包括啟動模塊、驅動模塊以及監(jiān)聽模塊,其中: 啟動模塊初始化事件驅動模塊及對象模塊; 驅動模塊接收一個或多個事件,所述事件由用戶對系統(tǒng)的操作產生;驅動模塊將所述事件傳遞給系統(tǒng)中的對象模塊; 監(jiān)聽模塊位于所述對象模塊中,當監(jiān)聽模塊監(jiān)聽到事件產生時,根據所述對象模塊內部的實現邏輯處理事件。
2.根據權利要求1所述的基于事件驅動的編輯器系統(tǒng),其特征在于:每個所述對象模塊均具有事件監(jiān)聽模塊;驅動模塊要創(chuàng)建一個或多個事件廣播器,每個事件廣播器內部維護一個事件監(jiān)聽模塊列表。
3.根據權利要求2所述的基于事件驅動的編輯器系統(tǒng),其特征在于:驅動模塊根據事件廣播器內的事件監(jiān)聽模塊列表,將事件主動推送給對象模塊,其中所述對象模塊的監(jiān)聽模塊包含在該事件監(jiān)聽模塊列表內。
4.根據權利要求1所述的基于事件驅動的編輯器系統(tǒng),其特征在于:驅動模塊將所述事件傳遞給系統(tǒng)中的對象模塊之前,首先通過廣播方式詢問相關模塊是否允許該所述事件發(fā)生,如果允許,則傳遞所述事件,如果不允許,則不會傳遞所述事件。
5.根據權利要求1所述的基于事件驅動的編輯器系統(tǒng),其特征在于:在所述驅動模塊退出之前,每個對象模塊必須首先不再監(jiān)聽事件,然后銷毀事件監(jiān)聽模塊。
6.一種基于事件驅動的利用權利要求1-5中任一項所述的基于事件驅動的編輯器系統(tǒng)的編輯器方法,其特征在于,該方法包括以下步驟: O分別初始化事件驅動模塊及對象模塊; 2)驅動模塊首先接收一個或多個事件,其中所述事件由用戶對系統(tǒng)的操作產生;然后將所述事件傳遞給系統(tǒng)中的對象模塊; 3)當位于對象模塊內的監(jiān)聽模塊監(jiān)聽到事件產生時,根據所述對象模塊內部的實現邏輯處理事件。
7.根據權利要求6所述的基于事件驅動的編輯器方法,其特征在于:在步驟I)中,初始化對象模塊步驟中,每個所述對象模塊均創(chuàng)建事件監(jiān)聽模塊;并且對應地,初始化事件驅動模塊步驟中,事件驅動模塊要創(chuàng)建一個或多個事件廣播器,其中每個事件廣播器內部維護一個事件監(jiān)聽模塊列表。
8.根據權利要求7所述的基于事件驅動的編輯器方法,其特征在于:在步驟2)中,驅動模塊通過事件廣播器內的事件監(jiān)聽模塊列表,將事件主動推送給對象模塊,所述對象模塊的監(jiān)聽模塊包含在該事件監(jiān)聽模塊列表內。
9.根據權利要求6所述的基于事件驅動的編輯器方法,其特征在于:在步驟2)中,驅動模塊將所述事件傳遞給系統(tǒng)中的對象模塊之前,通過廣播方式詢問相關模塊是否允許該所述事件發(fā)生,如果允許,則傳遞所述事件,如果不允許,則不會傳遞所述事件。
10.根據權利要求6所述的基于事件驅動的編輯器方法,其特征在于:該方法還包括退出步驟4),在驅動模塊退出之前,每個對象模塊必須首先不再監(jiān)聽事件,然后銷毀事件監(jiān)聽模塊。
【文檔編號】G06F9/44GK104503748SQ201410760086
【公開日】2015年4月8日 申請日期:2014年12月12日 優(yōu)先權日:2014年12月12日
【發(fā)明者】李晶晶, 董波, 楊林 申請人:珠海金山網絡游戲科技有限公司, 成都西山居互動娛樂科技有限公司