一种简单的消息和事件传递模型

来源:互联网 发布:智明创发软件待遇 编辑:程序博客网 时间:2024/06/06 23:55

在日常的工作中,我们经常需要处理消息和事件的业务逻辑。这里先以最精简的代码简要说明<相关结构定义并未提供,只提供一种思路>,后续会不断扩充和完善。

基类和控制器

class CUnitBase{public:    enum UnitType    {        unit_A,        unit_B,    };public:    CUnitBase();    virtual ~CUnitBase();    virtual void Init(UnitType tp) { m_type = tp; }    virtual BOOL OnMsg(PACKET_COMMAND* pPacket) = 0;    virtual BOOL OnEvent(Event* pEvent) = 0;protected:    UnitType    m_type;}class CUnitCtrl{public:    CUnitCtrl();    ~CUnitCtrl();    void Init();    BOOL OnMsg(PACKET_COMMAND* pPacket);    BOOL OnEvent(Event* pEvent);private:    CUtlLinkedList<CUnitBase*> m_unitList;}

1.注册派生类 2.将消息和事件传递给派生类

#define REGIST_UNIT(ActCls,tp) \    pUnit = new ActCls; \    pUnit->Init(tp);    \    m_unitList.AddToTail(pUnit);void CUnitCtrl::Init(){    REGIST_UNIT(CUnitA, CUnitBase::unit_A);    REGIST_UNIT(CUnitB, CUnitBase::unit_B);}BOOL CUnitCtrl::OnMsg(PACKET_COMMAND* pPacket){    FOR_EACH_LIST(m_unitList, index)    {        CUnitBase* pUnit = m_unitList.Element(index);        if(pUnit->OnMsg(pPacket)) return TRUE;    }    return FALSE;}BOOL CUnitCtrl::OnEvent(Event* pEvent){    FOR_EACH_LIST(m_unitList, index)    {        CUnitBase* pUnit = m_unitList.Element(index);        if(pUnit->OnEvent(pEvent)) return TRUE;    }    return FALSE;}

派生类的定义

class CUnitA : public CUnitBase{public:    CUnitA()    ~CUnitA()    virtual BOOL OnMsg(PACKET_COMMAND* pPacket);    virtual BOOL OnEvent(Event* pEvent);}class CUnitB : public CUnitBase{public:    CUnitB()    ~CUnitB()    virtual BOOL OnMsg(PACKET_COMMAND* pPacket);    virtual BOOL OnEvent(Event* pEvent);}

效果示例

CUnitCtrl m_unitCtrl;m_unitCtrl->Init();m_unitCtrl->OnMsg();m_unitCtrl->OnEvent();==> A OnMsg   OnEvent==> B OnMsg   OnEvent
原创粉丝点击