最近总监交给我们一些改进架构方面的任务,其中一个就是改进消息处理的架构,原来的消息处理的架构是在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直接调用消息处理函数。就是这个思路。
可能有更好的办法,但是自己目前还没有想到,还是那句话,运用之妙存乎一心。 只要合理,怎么都行。呵呵。
阅读(650) | 评论(0) | 转发(0) |