Chinaunix首页 | 论坛 | 博客
  • 博客访问: 433545
  • 博文数量: 138
  • 博客积分: 4114
  • 博客等级: 上校
  • 技术积分: 1341
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-14 20:41
文章分类

全部博文(138)

文章存档

2014年(1)

2013年(2)

2012年(78)

2011年(13)

2010年(34)

2009年(10)

我的朋友

分类: LINUX

2010-04-27 11:08:15

最近总监交给我们一些改进架构方面的任务,其中一个就是改进消息处理的架构,原来的消息处理的架构是在switch里的,通过比对每一个id来new 相应的类来处理消息,但是这种架构效率太低了,刚开始消息不多的时候可以,但是如果消息增加的话,每次为了处理一个消息都要比对好几次才能到new相应的类。鉴于此,技术总监建议用函数指针来改进,剩下的就什么也没说了。
  刚开始的时候总是想不通,switch效率低,因为在我看来这个挺清晰的,就是比对,就没有想过其它的。但是这里面有提高的空间。是自己的没有好好思考,遇到问题总是不深入分析,停留在表面,这样是不会有收获的,更不会有什么真知灼见的。
  最后花了一天的时间,好好的想了想这个问题,给出了自己的解决方案,方案思路如下
// msg_factory.h
class MsgFactory_c
{
    public:
      static MsgBase_c * CreateMsg_1();
      .....

};

//msg_factory.cpp

MsgBase_c *MsgFactory_c::CreateMsg_c()
{
   return new OneConcreateMsg_c;
}



//msg_base.h
class MsgBase_c
{
   ...
};

// one_concreate_msg.h
class OneConcreateMsg_c
   : public  MsgBase_c
{
   ...
};

//msg_handler.h
class MsgHandler_c
{
   private:
     static MsgReflect[MSG_MAX_NUM];
   public:
     void InitMsgReflect();
     bool HandleMsg(int msgid);
};

// msg_handler.cpp
MsgHandler_c::MsgReflect[MSG_MAX_NUM] = {0};
void MsgHandler_c::InitMsgReflect()
{
    MsgReflect[MSG_ONE] = &MsgFactory_c::CreateMsg_1;
}
bool MsgHandler_c::HandleMsg(int msgid)
{
   MsgReflect[msgid]();
}


总体架构就是这个样子了,就是先建立消息id和消息处理函数指针的映射关系,然后根据来的消息id直接调用消息处理函数。就是这个思路。

可能有更好的办法,但是自己目前还没有想到,还是那句话,运用之妙存乎一心。 只要合理,怎么都行。呵呵。
阅读(623) | 评论(0) | 转发(0) |
0

上一篇:c++ static

下一篇:unit_test

给主人留下些什么吧!~~