object-c编程tips

如何写一个对扩展开发对修改关闭的推送消息处理中心?

前一段时间做的推送消息处理,总是要根据不同的消息类型,进入到不同的消息处理流程中。由于消息处理流程的总体框架大同小异,只是具体的很小的一块代码不同。 于是很容易想到使用模板方法模式基类写框架流程,派生类负责具体的实现。

需要有三个类:

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进行不同的处理。

总结:

对扩展开放,可以新建派生类。对修改关闭,不需要对基类以及消息中心有任何改变。

代码包装性比较好。自认为不错的思路,欢迎交流。

好了消息中心的就写到这里。为了自己的小小思想能有一个小的记录。

object-c编程tips

时间: 2024-10-12 19:35:17

object-c编程tips的相关文章

Java编程Tips

原文: Java编程中"为了性能"尽量要做到的一些地方 作者: javatgo 最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使

[Object]面向对象编程(自己总结版)

[Object]面向对象编程(自己总结版) 2014-06-06 面向对象编程 感受:原理javascript也可以用完全面向对象的方式编程,兴奋得一个晚上都没睡好觉. 有种越深入越想编程的状态,有种上瘾的快感. 1,面向对象方式编程 Js代码   function Aa(){ //属性设置 this.property1:value1,//例如this.nameinput = $("input['name'=name]"); this.property2:value2, this.pr

[Object]面向对象编程(高程版)(0)属性和方法

[Object]面向对象编程(高程版)(0)属性和方法 博客分类: Web前端-JS语言核心 私有变量成员变量公有变量静态变量 zccst转载+原创 Js代码   function Person(){ var private_name = "小明"; //私有属性 var private_age = 10;      //私有属性 this.privilege_name = "小红"; //特权属性 this.privilege_age = 9;       //特

编程Tips

三元运算符 Vb中的iif(expr,truepart,falsepart)和C#中的expr?truepart:falsepart. 无论expr的结果是true还是false,true/falsepart都会被执行.所以不能写类似于obj!=null?obj.name:string.empty. truepart和falsepart的语句返回类型必须相同. 反射会造成性能损失,所以在多次调用某个语句,而该语句又使用反射获取信息时,应该进行代码改造. VB中的AndAlso类似于C#中的&&am

编程Tips集锦

以下是自己编程的一些小贴士,记录,总结提高自己. 1.python中集合类型的查找,尽量用dict or set类型. dict和set类型,在python内部的实现都是使用hash映射,查找的时间复杂度是O(1),比任何的查找算法都高效. 当在程序中使用到>1K次的查询,就应该开始考虑使用dict或set类型来进行数据的组织. 1 #coding:utf-8 2 from urllib.request import urlopen 3 from bs4 import BeautifulSoup

前端编程tips

1.ts less 网上搜视频教程,不用太复杂的,短短几分钟视频基本就对其入门了,比自己搜官网学习更方便. 常用的ts技术:let name:string="";  let obj:ClassName={};  let array:class[]=[]; as HTMLDivElement, interface calss private static public export ,以及()=>{};,箭头表达式 .dt.ts文件 2.less: @color:red; .com

1.JAVA 编程思想——对象入门

对象入门 欢迎转载,转载请标明出处:    http://blog.csdn.net/notbaron/article/details/51040219 如果学JAVA,没有读透<JAVA 编程思想>这本书,实在不好意思和别人说自己学过JAVA.鉴于此,蛤蟆忙里偷闲,偷偷翻看这本传说中的牛书. 面向对象编程OOP具有多方面吸引力.实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.已于维护的设计方案. 这些描述看上去非常吸引人的,不过蛤蟆还是没啥印象(至少到

韩顺平循序渐进学java 第04讲 流程控制

4.1 Java基本语法-三大流程控制 4.1.1 顺序控制 4.1.2 分支控制 ① 单分支 If(条件表达式) { 语句; } ② 双分支 If(条件表达式) { 语句; }else { 语句; } ③ 多分支 v  方法1: If(条件表达式) { 语句; }else if(条件表达式) { 语句; }else { 语句; } v  方法2: switch(条件表达式) { case 常量1: 语句1; break; case 常量2: 语句2; break; ... case 常量n:

layer——源码学习

/*! layer-v2.3 弹层组件 License LGPL http://layer.layui.com/ By 贤心 */ ; ! function(a, b) { "use strict"; var c, d, e = { //获取加载文件地址上级路径 getPath: function() { var a = document.scripts, b = a[a.length - 1], c = b.src; if (!b.getAttribute("merge&q