IMSDK封裝<二>
關於訊息的分發。
讓我們來思考這個問題,如何將底層模組的訊息拋給上層模組 ?
我們遵循設計模式的原則來思考。上層模組相對於底層模組來說需求變化要更劇烈點,因為上層模組數量不確定。因此,底層模組拋訊息給上層模組,不應該依賴於上層模組的具體類,應該是依賴於一個抽象介面,所以我們給上層模組建立一個父類。我們稱之為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;
相關文章
- IMSDK封裝<三>封裝
- IMSDK封裝<一>封裝
- JS物件之封裝(二)JS物件封裝
- Dapper的封裝、二次封裝、官方擴充套件包封裝,以及ADO.NET原生封裝APP封裝套件
- Flutter Dio二次封裝Flutter封裝
- axios二次封裝iOS封裝
- 二維碼簡單封裝封裝
- 二次封裝WebDriverWait封裝WebAI
- ACE之(二)ACE Socket封裝器封裝
- axios的二次封裝iOS封裝
- elment dialog二次封裝封裝
- OpenResty Redis操作二次封裝RESTRedis封裝
- FMDB 二次封裝,面向模型封裝模型
- axios二次封裝學習iOS封裝
- JavaFx 生成二維碼工具類封裝Java封裝
- 二次封裝 query ajax 辦法封裝
- uview-ui toast 二次封裝ViewUIAST封裝
- FMDB 二次封裝工具類,讓你快速學會封裝,整合資料庫封裝資料庫
- Selenium二次封裝-Python版本封裝Python
- 對AlamofireObjectMapper進行二次封裝ObjectAPP封裝
- 微信支付iOS整合與二次封裝iOS封裝
- 使用元件封裝資料庫操作(二) (轉)元件封裝資料庫
- 【封裝那些事】 缺失封裝封裝
- python二郎成長筆記(二)(封裝類class)Python筆記封裝
- selenium-webdriver的二次封裝(十)Web封裝
- 基於Glide4.7.1二次封裝IDE封裝
- 小程式 二次封裝wx.request方法封裝
- notification 全解和 api 的二次封裝API封裝
- android volley解析與二次封裝Android封裝
- Airtest封裝的Tidevice介面有多好用(二)AI封裝IDEdev
- 封裝封裝
- 【封裝小技巧】is 系列方法的封裝封裝
- 【JavaScript框架封裝】公共框架的封裝JavaScript框架封裝
- Sqlite封裝1-基本封裝-SqliteToolSQLite封裝
- 基於 uber 開源的 zap 二次封裝封裝
- Disruptor 高效能併發框架二次封裝框架封裝
- Android 談談封裝那些事 –BaseActivity 和 BaseFragment(二)Android封裝Fragment
- 擁抱RxJava(二):Observable究竟如何封裝資料?RxJava封裝