用回调函数实现一个数据通讯模型

     今天周五,没有什么事就用回调实现一个简单的数据通讯模型,先解释下基本概念。回调函数:一个通过函数指针调用的函数,把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

  函数指针模型:void(FP*)(),下面我们就用函数指针来实现简单的回调函数。

  一般来说,我们接受message的类并不直接处理业务逻辑,一般将业务逻辑交给另外一个类处理,那怎么样在接收到message的类里面要接受到消息就立即调用业务逻辑类的相应函数那?其实方法很多,这里主要学习通过回调机制实现,下面直接上代码:

#include <iostream>
using namespace std;

class CDataComunication
{
public:
    typedef void(*CallbackFunc)(int event);
    enum callbackID //实践ID,可以在接收到MSG时做为回调的参数。
    {
        DATA_A,
            DATA_B,
            DATA_C,
            DATA_NUM
    };

    ~CDataComunication(){}
    static CDataComunication& getInstance(void)  //简单的单例,这里暂时不考虑多线程
    {
        static CDataComunication datacomun;
        return datacomun;
    }

    bool registerCallBackFunc(CallbackFunc callback)  //注册回调函数
    {
        bool flag = false;
        if(NULL != callback)
        {
            m_callback = callback;
            flag = true;
        }
        return flag;
    }
    void TestCallback(int test) //这个主要是为了测试回调函数,如果在实际项目中,可以是接受其他线程或进程的message的入口
    {
        (*m_callback)(test);
    }
private:
    CDataComunication():m_callback(NULL) //构造函数私有
    {
    }

private:
    CallbackFunc m_callback;
};


class CDataProcess
{
private:
    CDataComunication& m_dateComun;
public:
    CDataProcess():m_dateComun(CDataComunication::getInstance()){}


    static void execCallBack(int event) //处理回调事件
    {
        switch(event)
        {
        case CDataComunication::DATA_A:
            cout<<"execCallBack AA"<<endl;
            break;
        case CDataComunication::DATA_B:
            cout<<"execCallBack BB"<<endl;
            break;
        case CDataComunication::DATA_C:
            cout<<"execCallBack CC"<<endl;
            break;
        default:
            break;
        }
    }
    void init(void)
    {
        m_dateComun.registerCallBackFunc(execCallBack);
    }
};

int main(int argc, char** argv)
{
    CDataProcess dataProcess;
    dataProcess.init();        //初始化

    CDataComunication dataCom = CDataComunication::getInstance();
    dataCom.TestCallback(1);  //这个主要是为了测试回调函数,如果在实际项目中,可以是接受其他线程或进程的message的入口

    return 0;
}

下面是测试结果:

  

posted @ 2017-12-15 23:15  1点er执着  阅读(513)  评论(0编辑  收藏  举报