IMSDK封裝<二>

xiaobaicai發表於2016-03-07

關於訊息的分發。

讓我們來思考這個問題,如何將底層模組的訊息拋給上層模組 ?

我們遵循設計模式的原則來思考。上層模組相對於底層模組來說需求變化要更劇烈點,因為上層模組數量不確定。因此,底層模組拋訊息給上層模組,不應該依賴於上層模組的具體類,應該是依賴於一個抽象介面,所以我們給上層模組建立一個父類。我們稱之為SEXMPPModule。通過父類,我們便很容易想到,多型,執行時轉發訊息。我們讓父類擁有一個鉤子方法和一個空的實現方法,然後子類分別過載。

+ (BOOL)canHandleElement:(XMPPElement*)element;
- (void)handleElement:(XMPPElement*)element;  

說到這裡,我要說一下我們的XMPPManager是如何管理這些模組,我們在XMPPManager提供了一個介面,該介面通過名字來獲取模組物件,如果不存在,會在內部建立。

- (SEXMPPModule*)moduleForClassName:(NSString*)className;  

並且我們提供了一個巨集,來讓各模組便利化的從XMPPManager獲取自己。

#define SEXMPPModuleGet(module) (module*) [[SEXMPPManager shareInstance] moduleForClassName:[NSString stringWithFormat:@"%s", #module]]  

那麼方案一就出來了

我們讓XMPPManager持有所有上層模組,一旦XMPPManager接收到訊息,然後我們就遍歷持有的上層模組,執行下面程式碼進行判斷

+ (BOOL)canHandleElement:(XMPPElement*)element;  

若返回yes,就讓這個模組處理下面的程式碼,也就達到了訊息的分發

- (void)handleElement:(XMPPElement*)element  

方案一簡單清晰, 足夠滿足需求。我們也推薦方案一。

當然,還有方案二

方案二存在,當且上層的模組又有一些子模組的時候,我們應該把訊息分發到最小的模組裡面去。這個時候,方案一就行不通了。因為我們需要維護模組的鏈式關係。

這個時候我們可以把具體模組管理的任務交給這個SEXMPPModule去做。我們讓SEXMPPModule以字典的形式來管理子模組。key為父模組名,value用陣列來存放子模組名。

我們在SEXMPPModule提供一個註冊方法來維護這種鏈式關係。

+ (void)registerSubModuleWithClassName:(NSString*)subClassName toSuperClassName:(NSString*)superClassName;  

然後我們在通過element訊息去遞迴的在字典裡找出需要響應訊息的模組的名字。

+ (NSString*)processClassNameForElement:(XMPPElement*)element;  

最後我們通過模組名字在XFManager裡面找到具體的模組類,然後將訊息分發給它。

- (SEXMPPModule*)moduleForClassName:(NSString*)className; 

相關文章