• 2010-09-09

    一个用C++实现的Dispatcher(一)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/74629744.html

    又和一个团队合作,面前又摆着一堆分发的代码,不同的是,这次用的是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;

    分享到:

    历史上的今天:

    引用地址: