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