消息机4_B

来源:互联网 发布:java matcher group 编辑:程序博客网 时间:2024/05/17 01:01
/******************************************************************** author  :   Clark/陈泽丹 created :   2013-9-10 purpose :   计数释放*********************************************************************/#pragma onceclass AutoRelease{public:AutoRelease(void){ m_count = 0; }virtual ~AutoRelease(void){}AutoRelease* GetPointClone(){++m_count; return this; }void Release(){m_count = m_count - 1;  if( m_count <= 0) delete this; }private:long m_count;};


/******************************************************************** author  :   Clark/陈泽丹 created :   2013-9-10 purpose :   消息处理器*********************************************************************/#pragma once#include <string>#include <map>using namespace std;typedef map< string, void* > LST_EVT_TYPE;class IMsgListener{public:virtual ~IMsgListener(){};virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt ) = 0;};

/******************************************************************** author  :   Clark/陈泽丹 created :   2013-9-10 purpose :   消息关联项*********************************************************************/#pragma once#include "IMsgListener.h"class IMsgServerItem{public:virtual ~IMsgServerItem(){}virtual bool AddListener( string _msg, IMsgListener* _p_lst ) = 0;virtual void RemoveListener( string _msg, IMsgListener* _p_lst ) = 0;virtual void UpdataListener() = 0;virtual bool DispatchEvt( string _msg, LST_EVT_TYPE* _evt ) = 0;};

/******************************************************************** author  :   Clark/陈泽丹 created :   2013-9-10 purpose :   消息处理器*********************************************************************/#pragma once#include "AutoRelease.h"#include "IMsgListener.h"#include "MsgServer4.h"#include <iostream>using namespace std;class VoteTest:public IMsgListener{public:virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt ){cout<<"VoteTest"<<endl;return false;}};class InitTest:public IMsgListener{public:virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt ){cout<<"InitTest"<<endl;return true;}};class ActTest:public IMsgListener{public:virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt ){cout<<"ActTest"<<endl;return true;}};class UninitTest:public IMsgListener{public:virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt ){cout<<"UninitTest"<<endl;return true;}};class EvtHelper: public AutoRelease{public:virtual bool Init() = 0;virtual void UnInit() = 0;};template< class _LST_TYPE >class ComEvtHelper: public EvtHelper{public:ComEvtHelper( MsgServer4* _msg_svr, string _msg, int _lst_type, _LST_TYPE& _p_evt_hd, LST_EVT_TYPE* _p_evt_cdt = 0 ):m_evt_handle(_p_evt_hd, _p_evt_cdt){m_msg_svr = _msg_svr;m_type = _lst_type;m_msg = _msg;}~ComEvtHelper(){}bool Init(){ return m_msg_svr->AddListener( m_msg, m_type, &m_evt_handle ); }void UnInit(){ m_msg_svr->RemoveListener( m_msg, m_type, &m_evt_handle ); }private:class ComEvtHandle: public IMsgListener{public:ComEvtHandle( _LST_TYPE& _p_evt_hd, LST_EVT_TYPE* _p_evt_cdt ){mp_evt_hd = _p_evt_hd;_p_evt_hd = 0;if( 0 != _p_evt_cdt )mp_evt_cdt = *_p_evt_cdt; }virtual ~ComEvtHandle(){ delete mp_evt_hd;mp_evt_hd = 0;}virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt ){LST_EVT_TYPE::iterator it = mp_evt_cdt.begin();while( mp_evt_cdt.end() != it ){LST_EVT_TYPE::iterator tmp = _evt->find( it->first );if( _evt->end() == tmp || tmp->second != it->second )return false;it++;}return mp_evt_hd->OnEvt(_msg, _evt);}private:_LST_TYPEmp_evt_hd;LST_EVT_TYPEmp_evt_cdt;};ComEvtHandlem_evt_handle;MsgServer4*m_msg_svr;intm_type;stringm_msg;};typedef bool (*ON_EVT_TYPE)(string, LST_EVT_TYPE*); template<>class ComEvtHelper< ON_EVT_TYPE >: public EvtHelper{public:ComEvtHelper( MsgServer4* _msg_svr, string _msg, int _lst_type, ON_EVT_TYPE& _evt_hd, LST_EVT_TYPE* _p_evt_cdt = 0 ):m_evt_handle(_evt_hd, _p_evt_cdt){m_msg_svr = _msg_svr;m_type = _lst_type;m_msg = _msg;}~ComEvtHelper(){}bool Init(){ return m_msg_svr->AddListener( m_msg, m_type, &m_evt_handle ); }void UnInit(){ m_msg_svr->RemoveListener( m_msg, m_type, &m_evt_handle ); }private:class ComEvtHandle: public IMsgListener{public:ComEvtHandle( ON_EVT_TYPE& _evt_hd, LST_EVT_TYPE* _p_evt_cdt ){mp_evt_hd = _evt_hd;if( 0 != _p_evt_cdt )mp_evt_cdt = *_p_evt_cdt; }virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt ){LST_EVT_TYPE::iterator it = mp_evt_cdt.begin();while( mp_evt_cdt.end() != it ){LST_EVT_TYPE::iterator tmp = _evt->find( it->first );if( _evt->end() == tmp || tmp->second != it->second )return false;it++;}return mp_evt_hd(_msg, _evt);}private:ON_EVT_TYPEmp_evt_hd;LST_EVT_TYPEmp_evt_cdt;};ComEvtHandlem_evt_handle;MsgServer4*m_msg_svr;intm_type;stringm_msg;};template< class _LST_TYPE >EvtHelper* CreateComEvtHelper( MsgServer4* _msg_svr, string _msg, int _lst_type, _LST_TYPE _p_evt_hd, LST_EVT_TYPE* _p_evt_cdt = 0 ){return new ComEvtHelper<_LST_TYPE>( _msg_svr, _msg, _lst_type, _p_evt_hd, _p_evt_cdt );}

/******************************************************************** author  :   Clark/陈泽丹 created :   2013-9-10 purpose :   消息关联中心*********************************************************************/#pragma once#include "IMsgListener.h"#include "IMsgServerItem.h"#include "MsgSvrItem.h"#include <vector>#include <string>using namespace std;class MsgServer4{public:MsgServer4(void);virtual ~MsgServer4(void);void PushSvr( int _sign, IMsgServerItem* _msg_svr );void Clear();bool AddListener( string _msg, int _lst_type, IMsgListener* _p_lst );void RemoveListener( string _msg, int _lst_type, IMsgListener* _p_lst );void DispatchEvt( string _msg, LST_EVT_TYPE* _evt );private:typedef pair<int, IMsgServerItem*>SVR_TYPE;vector<SVR_TYPE>mvct_msg_svr;};class MsgServer4Helper{public:enum MSG_SVR_TYPE{VOTE=1,INIT=2,ACTION=3,UNINIT=4,};void Init();void UnInit();MsgServer4*GetSvr();LST_EVT_TYPE*GetPar();private:MsgServer4g_msg_svr4;LST_EVT_TYPEg_evt;IMsgServerItem* p_vote_svr;IMsgServerItem* p_init_svr;IMsgServerItem* p_action_svr;IMsgServerItem* p_uninit_svr;};

#include "MsgServer4.h"MsgServer4::MsgServer4(){}MsgServer4::~MsgServer4(void){Clear();}void MsgServer4::PushSvr( int _sign, IMsgServerItem* _msg_svr ){SVR_TYPE tmp = make_pair(_sign, _msg_svr);mvct_msg_svr.push_back(tmp);_msg_svr = 0;}void MsgServer4::Clear(){mvct_msg_svr.clear();}bool MsgServer4::AddListener( string _msg, int _lst_type, IMsgListener* _p_lst ){if( _lst_type >= 0 && _lst_type <= mvct_msg_svr.size() ){long len = mvct_msg_svr.size();for( int i=0; i<len; i++ ){if( mvct_msg_svr[i].first == _lst_type ){return mvct_msg_svr[i].second->AddListener(_msg, _p_lst); }}}return false;}void MsgServer4::RemoveListener( string _msg, int _lst_type, IMsgListener* _p_lst ){if( _lst_type >= 0 && _lst_type <= mvct_msg_svr.size() ){long len = mvct_msg_svr.size();for( int i=0; i<len; i++ ){if( mvct_msg_svr[i].first == _lst_type ){mvct_msg_svr[i].second->RemoveListener(_msg, _p_lst); return;}}}}void MsgServer4::DispatchEvt( string _msg, LST_EVT_TYPE* _evt ){int len = mvct_msg_svr.size();for( int i=0; i<len; i++){if( true == mvct_msg_svr[i].second->DispatchEvt(_msg,_evt) )return;}}void MsgServer4Helper::Init(){p_vote_svr = new VoteMsgSvrItem();p_init_svr = new ActionMsgSvrItem();p_action_svr = new ActionMsgSvrItem();p_uninit_svr = new ActionMsgSvrItem();g_msg_svr4.PushSvr( MSG_SVR_TYPE::VOTE,p_vote_svr );g_msg_svr4.PushSvr( MSG_SVR_TYPE::INIT,p_init_svr );g_msg_svr4.PushSvr( MSG_SVR_TYPE::ACTION,p_action_svr );g_msg_svr4.PushSvr( MSG_SVR_TYPE::UNINIT,p_uninit_svr );}void MsgServer4Helper::UnInit(){g_msg_svr4.Clear();delete p_vote_svr;delete p_init_svr;delete p_action_svr;delete p_uninit_svr;}MsgServer4* MsgServer4Helper::GetSvr(){return &g_msg_svr4;}LST_EVT_TYPE* MsgServer4Helper::GetPar(){return &g_evt;}

/******************************************************************** author  :   Clark/陈泽丹 created :   2013-9-10 purpose :   消息关联项实例*********************************************************************/#pragma once#include "IMsgServerItem.h"#include <vector>#include <map>#include <string>using namespace std;class BaseMsgSvrItem: public IMsgServerItem{public:BaseMsgSvrItem();virtual ~BaseMsgSvrItem();virtual bool AddListener( string _msg, IMsgListener* _p_lst );virtual void RemoveListener( string _msg, IMsgListener* _p_lst );virtual void UpdataListener();virtual bool DispatchEvt( string _msg, LST_EVT_TYPE* _evt ) = 0;protected:typedef vector< IMsgListener* >LIST_TYPE;typedef map<  string, LIST_TYPE* >LST_MAP_TYPE;typedef pair< string, IMsgListener* >REMOVE_TYPE;LST_MAP_TYPEm_map_lst;private:vector< REMOVE_TYPE >m_vct_remove;};class VoteMsgSvrItem: public BaseMsgSvrItem{public:virtual bool DispatchEvt( string _msg, LST_EVT_TYPE* _evt );};class ActionMsgSvrItem: public BaseMsgSvrItem{public:virtual bool DispatchEvt( string _msg, LST_EVT_TYPE* _evt );};

#include "MsgSvrItem.h"BaseMsgSvrItem::BaseMsgSvrItem(){}BaseMsgSvrItem::~BaseMsgSvrItem(){LST_MAP_TYPE::iterator it = m_map_lst.begin();while( it != m_map_lst.end() ){LIST_TYPE* p_items = it->second;it->second = 0;it++;delete p_items;}m_map_lst.clear();m_vct_remove.clear();}bool BaseMsgSvrItem::AddListener( string _msg, IMsgListener* _p_lst ){LST_MAP_TYPE::iterator it = m_map_lst.find(_msg);if( m_map_lst.end() == it ){m_map_lst[_msg] = new vector<IMsgListener*>();m_map_lst[_msg]->push_back(_p_lst);return true;}else{LIST_TYPE items = *(it->second);long len = items.size();for( long i=0; i<len; i++ ){if( items[i] == _p_lst )return false;}items.push_back(_p_lst);return true;}}void BaseMsgSvrItem::RemoveListener( string _msg, IMsgListener* _p_lst ){m_vct_remove.push_back( make_pair(_msg, _p_lst) );}void BaseMsgSvrItem::UpdataListener(){long len = m_vct_remove.size();for( int i=0; i<len; i++ ){REMOVE_TYPE tmp = m_vct_remove[i];LST_MAP_TYPE::iterator it = m_map_lst.find( tmp.first );if( m_map_lst.end() != it ){LIST_TYPE* p_items = (it->second);long len = p_items->size();for( long i=0; i<len; i++ ){if( (*p_items)[i] == tmp.second ){for( long j=i+1; i<len-1; i++ ){(*p_items)[j-1] = (*p_items)[j];}p_items->pop_back();}}}}}bool VoteMsgSvrItem::DispatchEvt( string _msg, LST_EVT_TYPE* _evt ){UpdataListener();bool ret = false;LST_MAP_TYPE::iterator it = m_map_lst.find( _msg );if( m_map_lst.end() != it ){LIST_TYPE* p_items = (it->second);long len = p_items->size();for( long i=0; i<len; i++ ){if( true == (*p_items)[i]->OnEvt(_msg, _evt) ){ret = true;break;}}}UpdataListener();return ret;}bool ActionMsgSvrItem::DispatchEvt( string _msg, LST_EVT_TYPE* _evt ){UpdataListener();LST_MAP_TYPE::iterator it = m_map_lst.find( _msg );if( m_map_lst.end() != it ){LIST_TYPE* p_items = (it->second);long len = p_items->size();for( long i=0; i<len; i++ ){(*p_items)[i]->OnEvt(_msg, _evt);}}UpdataListener();return false;}

#include <iostream>#include "MsgListener.h"#include "MsgSvrItem.h"#include "MsgServer4.h"using namespace std;bool OnEvtTest( string _msg, LST_EVT_TYPE* _evt ){cout<<"OnEvtTest"<<endl;return false;}void main(){MsgServer4Helper g_msg_svr4;g_msg_svr4.Init();LST_EVT_TYPE condition;condition["1"] = (void*)1;EvtHelper* p_vote= CreateComEvtHelper( g_msg_svr4.GetSvr(), "123", MsgServer4Helper::VOTE, new VoteTest(),&condition);EvtHelper* p_init= CreateComEvtHelper( g_msg_svr4.GetSvr(), "123", MsgServer4Helper::INIT, OnEvtTest, &condition );EvtHelper* p_act= CreateComEvtHelper( g_msg_svr4.GetSvr(), "123", MsgServer4Helper::ACTION, OnEvtTest, &condition );EvtHelper* p_uninit = CreateComEvtHelper( g_msg_svr4.GetSvr(), "123", MsgServer4Helper::UNINIT, OnEvtTest, &condition );p_vote->Init();p_init->Init();p_act->Init();p_uninit->Init();LST_EVT_TYPE* par = g_msg_svr4.GetPar();(*par)["1"] = (void*)1;(*par)["2"] = (void*)2;(*par)["3"] = (void*)3;g_msg_svr4.GetSvr()->DispatchEvt("123", g_msg_svr4.GetPar());p_uninit->UnInit();p_act->UnInit();g_msg_svr4.GetSvr()->DispatchEvt("123", g_msg_svr4.GetPar());p_init->UnInit();p_vote->UnInit();system("pause");g_msg_svr4.UnInit();p_vote->Release();p_init->Release();p_act->Release();p_uninit->Release();}


原创粉丝点击