object-c編程tips

來源:互聯網
上載者:User

標籤: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進行不同的處理。


總結:

對擴充開放,可以建立衍生類別。對修改關閉,不需要對基類以及訊息中心有任何改變。

程式碼封裝裝性比較好。自認為不錯的思路,歡迎交流。


好了訊息中心的就寫到這裡。為了自己的小小思想能有一個小的記錄。










相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.