一个用C++实现的Dispatcher(一)
又和一个团队合作,面前又摆着一堆分发的代码,不同的是,这次用的是C++:
if (msg->id == "open") {
MsgHandler handler(msg);
handler.open();
} else if (msg->id == "close") {
MsgHandler handler(msg);
handler.close();
} else if (…) {
…
} else {
// exception handler
…
}
不要问我为什么不是每个消息对应一种处理类,要是知道为什么,就不是遗留代码了。于是,我们尝试着用C++写了一个dispatcher。下面是这个dispatcher的声明:
#include <map>
typedef void (MsgHandler::*handlerFunc)();
class MsgDispatcher {
public:
...
void dispatch(Msg* msg);
private:
std::map<string, handlerFunc> handlers;
};
因为要处理遗留代码,这里用到了指向成员函数的指针,也就提高了理解这段代码的门槛。具体实现如下:
void MsgDispatcher::dispatch(Msg* msg) {
handlerFunc func = this->handlers[msg->id];
if (func) {
MsgHandler msgHandler(pkg);
(msgHandler.*func)();
} else {
// exception handler
…
}
}
注册很简单:
handlers["open"] = &MsgHandler::open;
handlers["close"] = &MsgHandler::close;