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

本文介绍了一种消息和事件处理的机制,通过基类CUnitBase和派生类CUnitA/CUnitB实现。该机制利用CUnitCtrl控制器进行消息和事件的分发,能够有效地组织和扩展业务逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

基类和控制器

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值