標籤:style 使用 io for cti ar 代碼 時間
如何寫一個對擴充開發對修改關閉的推送訊息處理中心?
前一段時間做的推送訊息處理,總是要根據不同的訊息類型,進入到不同的訊息處理流程中。由於訊息處理流程的總體架構大同小異,只是具體的很小的一塊代碼不同。 於是很容易想到使用模板方法模式基類寫架構流程,衍生類別負責具體的實現。
需要有三個類:
LPPushDispatchCenter: 訊息處理中心類
LPPushDispatch :訊息處理基類
LPDetailPushDispatch(很多很多個這樣的衍生類別): 訊息處理衍生類別
所有的訊息首先進入訊息處理中心,它實現為一個單例類,是為了外部更方便的使用。它儲存了訊息類型和對應的衍生類別對象的映射。
當需要handleMessage時候,它根據訊息的類型找到具體的訊息處理衍生類別對象,然後建立相應的對象,進行具體的處理。如何儲存訊息類型和處理對象的映射呢? 剛開始的時候實現的比較簡單,直接switch case, 根據type返回不同的類對象。 現在仔細看了類對象的載入過程,發現load方法會在類對象載入的時候調用,於是聯想到可以在衍生類別中的load方法告知自己的type,並將自身type和class綁定註冊到訊息中心中。
訊息中心的主要方法:
#pragma mark 單例方法//單例+(LPPushDispatchCenter*)shareInstance{ static dispatch_once_t onceToken; static LPPushDispatchCenter *pushCenter = nil; dispatch_once(&onceToken, ^{ pushCenter = [[self alloc] init]; }); return pushCenter;}-(id)init{ if(self = [super init]){ _typeAndClassDic = [[NSMutableDictionary alloc]init]; } return self;}-(void)registerPushType:(NSInteger)type andClass:(Class)typeClass{ if(_typeAndClassDic[@(type)]){ NSLog(@"ERROR: type(%ld) has same class", type); return; } _typeAndClassDic[@(type)] = typeClass;}-(void)handleMessage:(LPPushMessage*)msg{ NSInteger type = msg.type; Class typeClass = _typeAndClassDic[@(type)]; if (typeClass) { LPPushDispatch* dispatch = [[typeClass alloc]init]; dispatch.pushMessage = msg; [dispatch handlePushMessage]; } else{ NSLog(@"handleMessageWithType: unknown type(%ld)", type); }}
訊息中心只有一個外部方法,handleMessage,它傳入msg, 根據msg的type類型在_typeAndClassDic中找到對應的class類對象,建立對應的對象,賦值pushMessage參數,調用LPPushDispatch的handlePushMessage方法。
LPPushDispatch基類架構:
+(void)setType:(NSInteger)type{ [[LPPushDispatchCenter shareInstance] registerPushType:type andClass:[self class]];}/** 處理推送訊息 */-(void)handlePushMessage{ BOOL isNeedHandle = [self beforeHandleMessage]; if(isNeedHandle){ [self handlingPushMessage]; [self afterHandleMessage]; }}//預先處理-(BOOL)beforeHandleMessage{ return YES;}//正在處理-(void)handlingPushMessage{ [self openMessage];}//後處理-(void)afterHandleMessage{}
它提供了一個setType方法供衍生類別調用,衍生類別調用setType來將自己的type和class註冊到LPPushDispatchCenter中。真正的處理方法是handlingPushMessage,它裡面調用衍生類別的openMessage方法。
再看LPDetailPushDispatch衍生類別:
+(void)load{ DLog(@""); self.type = 0;}- (void)openMessage { DLog(@"%@", self.pushMessage);}
它使用self.type調用基類的setType方法,將自己註冊到訊息中心類的字典中。 同時還需要實現的有openMessage方法,它根據不同self.pushMessage進行不同的處理。
總結:
對擴充開放,可以建立衍生類別。對修改關閉,不需要對基類以及訊息中心有任何改變。
程式碼封裝裝性比較好。自認為不錯的思路,歡迎交流。
好了訊息中心的就寫到這裡。為了自己的小小思想能有一個小的記錄。