首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

讯息机_第二版

2012-11-10 
消息机_第二版--- 事件最好不混入在消息内部,因为从概念上讲,事件和消息是两种不同的事物;从实际上讲,使用

消息机_第二版

--- 事件最好不混入在消息内部,因为从概念上讲,事件和消息是两种不同的事物;从实际上讲,使用时事件没必要带上复杂的参数,而获得事件也没必要从消息参数中获得,那样会增加操作。

 

/*********************************************************************  文件名:   Server.h*  文件描述: 网络游戏模拟*  创建人:   陈泽丹 ,2012年9月6日     *  版本号:   1.0*  修改记录:********************************************************************/#pragma once#include <iostream>#include <vector>#include <map>#include <algorithm>//--风格:编译期类型有大写, 执行期类型用小写using namespace std;namespace Server_Lib{//消息struct MsgHead{longType;void*Obj;};// 事件决策者订阅者接口template< class _TMsg = MsgHead >struct IPass_Event_Listener{ typedef _TMsg Msg;virtual bool on_pass(Msg *_p_msg) = 0; };// 事件否决者订阅者接口template< class _TMsg = MsgHead >struct IVote_Event_Listener{ typedef _TMsg Msg;virtual bool on_vote(Msg *_p_msg) = 0; };// 行为执行者订阅者接口template< class _TMsg = MsgHead >struct IAction_Event_Listener{ typedef _TMsg Msg;virtual void on_action(Msg *_p_msg) = 0; };// 事件响应者订阅者接口template< class _TMsg = MsgHead >struct IResponse_Event_Listener{ typedef _TMsg Msg;virtual void on_response(Msg *_p_msg) = 0; };// 事件服务器 -- 事件驱动,消息处理template< class _TEvt, class _TMsg >class IMsg_Server{public:typedef IPass_Event_Listener< _TMsg >PASS_EVENT_LISTENER;typedef IVote_Event_Listener< _TMsg >VOTE_EVENT_LISTENER;typedef IAction_Event_Listener< _TMsg >ACTION_EVENT_LISTENER;typedef IResponse_Event_Listener< _TMsg >RESPONSE_EVENT_LISTENER;//监控时以事件为要素virtual bool add_listener(const _TEvt _event, PASS_EVENT_LISTENER* _p_listener)= 0;virtual void remove_listener(const _TEvt _event, PASS_EVENT_LISTENER* _p_listener)= 0;virtual bool add_listener(const _TEvt _event, VOTE_EVENT_LISTENER* _p_listener)= 0;virtual void remove_listener(const _TEvt _event, VOTE_EVENT_LISTENER* _p_listener)= 0;virtual bool add_listener(const _TEvt _event, ACTION_EVENT_LISTENER* _p_listener)= 0;virtual void remove_listener(const _TEvt _event, ACTION_EVENT_LISTENER* _p_listener)= 0;virtual bool add_listener(const _TEvt _event, RESPONSE_EVENT_LISTENER* _p_listener)= 0;virtual void remove_listener(const _TEvt _event, RESPONSE_EVENT_LISTENER* _p_listener)= 0;//处理时以消息为要素virtual void dispatch_pass_msg(const _TEvt _event, _TMsg *_p_msg) = 0;virtual void dispatch_vote_msg(const _TEvt _event, _TMsg *_p_msg) = 0;};template< class _TEvt = long, class _TMsg = MsgHead >class Msg_Server: public IMsg_Server< _TEvt, _TMsg >{public:typedef vector< PASS_EVENT_LISTENER* >V_PASS_EVENT_LISTENER;typedef vector< VOTE_EVENT_LISTENER* >V_VOTE_EVENT_LISTENER;typedef vector< ACTION_EVENT_LISTENER* >V_ACTION_EVENT_LISTENER;typedef vector< RESPONSE_EVENT_LISTENER* >V_RESPONSE_EVENT_LISTENER;typedef map<_TEvt, V_PASS_EVENT_LISTENER>M_PASS_EVENT_LISTENER; typedef map<_TEvt, V_VOTE_EVENT_LISTENER>M_VOTE_EVENT_LISTENER;typedef map<_TEvt, V_ACTION_EVENT_LISTENER>M_ACTION_EVENT_LISTENER;typedef map<_TEvt, V_RESPONSE_EVENT_LISTENER>M_RESPONSE_EVENT_LISTENER;typedef Msg_Server< _TEvt, _TMsg >LOCAL_TYPE;//---------------------------------------------------------------------virtual bool add_listener(const _TEvt _event, PASS_EVENT_LISTENER* _p_listener){ return Msg_Manager<PASS_EVENT_LISTENER*>(this).add_listener(_p_listener, _event); }virtual void remove_listener(const _TEvt _event, PASS_EVENT_LISTENER* _p_listener){  Msg_Manager<PASS_EVENT_LISTENER*>(this).remove_listener(_p_listener, _event); }virtual bool add_listener(const _TEvt _event, VOTE_EVENT_LISTENER* _p_listener){ return Msg_Manager<VOTE_EVENT_LISTENER*>(this).add_listener(_p_listener, _event); }virtual void remove_listener(const _TEvt _event, VOTE_EVENT_LISTENER* _p_listener){  Msg_Manager<VOTE_EVENT_LISTENER*>(this).remove_listener(_p_listener, _event); }virtual bool add_listener(const _TEvt _event, ACTION_EVENT_LISTENER* _p_listener){ return Msg_Manager<ACTION_EVENT_LISTENER*>(this).add_listener(_p_listener, _event); }virtual void remove_listener(const _TEvt _event, ACTION_EVENT_LISTENER* _p_listener){  Msg_Manager<ACTION_EVENT_LISTENER*>(this).remove_listener(_p_listener, _event); }virtual bool add_listener(const _TEvt _event, RESPONSE_EVENT_LISTENER* _p_listener){ return Msg_Manager<RESPONSE_EVENT_LISTENER*>(this).add_listener(_p_listener, _event); }virtual void remove_listener(const _TEvt _event, RESPONSE_EVENT_LISTENER* _p_listener){  Msg_Manager<RESPONSE_EVENT_LISTENER*>(this).remove_listener(_p_listener, _event); }virtual void dispatch_pass_msg(const _TEvt _event, _TMsg *_p_msg) {//一票通过处理bool failed = true;M_PASS_EVENT_LISTENER* p_pass_event_listeners = Get_Listeners<PASS_EVENT_LISTENER*>()(this);M_PASS_EVENT_LISTENER::iterator vote_it = p_pass_event_listeners->find( _event );if( p_pass_event_listeners->end() != vote_it){V_PASS_EVENT_LISTENER *pv = &((*p_pass_event_listeners)[ _event ]);for( V_PASS_EVENT_LISTENER::const_iterator pass_it = pv->begin(); pv->end() != pass_it; ++pass_it){if( (*pass_it)->on_pass(_p_msg) ){failed = false;break;}}}if( failed) return;dispatch_msg(_event, _p_msg);}void dispatch_vote_msg(const _TEvt _event, _TMsg *_p_msg){//否决处理M_VOTE_EVENT_LISTENER* p_vote_event_listeners = Get_Listeners<VOTE_EVENT_LISTENER*>()(this);M_VOTE_EVENT_LISTENER::iterator vote_it = p_vote_event_listeners->find( _event );if( p_vote_event_listeners->end() != vote_it){V_VOTE_EVENT_LISTENER *pv = &((*p_vote_event_listeners)[ _event ]);for( V_VOTE_EVENT_LISTENER::const_iterator vote_it = pv->begin(); pv->end() != vote_it; ++vote_it){if( (*vote_it)->on_vote(_p_msg) )return;}}dispatch_msg(_event, _p_msg);}protected:void dispatch_msg(const _TEvt _event, _TMsg *_p_msg){//执行处理M_ACTION_EVENT_LISTENER* p_action_event_listeners = Get_Listeners<ACTION_EVENT_LISTENER*>()(this);M_ACTION_EVENT_LISTENER::iterator action_it = p_action_event_listeners->find( _event );if( p_action_event_listeners->end() != action_it){V_ACTION_EVENT_LISTENER *pv = &((*p_action_event_listeners)[ _event ]);for_each(pv->begin(), pv->end(), bind2nd(action_fun(),_p_msg));}//响应处理M_RESPONSE_EVENT_LISTENER* p_response_event_listeners = Get_Listeners<RESPONSE_EVENT_LISTENER*>()(this);M_RESPONSE_EVENT_LISTENER::iterator response_it = p_response_event_listeners->find( _event );if( p_response_event_listeners->end() != response_it){V_RESPONSE_EVENT_LISTENER *pv = &((*p_response_event_listeners)[ _event ]);for_each(pv->begin(), pv->end(), bind2nd(response_fun(),_p_msg));}}private:struct action_fun: public binary_function<ACTION_EVENT_LISTENER*, _TMsg *, void>{ void operator()(ACTION_EVENT_LISTENER *pIt, _TMsg *_p_msg) const { pIt->on_action(_p_msg); }};struct response_fun: public binary_function<RESPONSE_EVENT_LISTENER*, _TMsg *, void>{ void operator()(RESPONSE_EVENT_LISTENER *pIt, _TMsg *_p_msg) const { pIt->on_response(_p_msg); }};//----------------------- 管理器 ----------------------template< class _TEVENT_LISTENER_P> class Msg_Manager{public:typedef vector< _TEVENT_LISTENER_P >V_TEVENT_LISTENER;typedef map<_TEvt, V_TEVENT_LISTENER>M_TEVENT_LISTENER;Msg_Manager( LOCAL_TYPE *_p_local):mp_local(_p_local){}bool add_listener(_TEVENT_LISTENER_P _p_listener, const _TEvt _event) const{M_TEVENT_LISTENER* p_event_listeners = Get_Listeners<_TEVENT_LISTENER_P>()(mp_local);V_TEVENT_LISTENER* pv = &((*p_event_listeners)[_event]);V_TEVENT_LISTENER::iterator it = find(pv->begin(), pv->end(), _p_listener);if( pv->end() == it){pv->push_back(_p_listener);return true;}return false;}void remove_listener(_TEVENT_LISTENER_P _p_listener, const _TEvt _event) const {M_TEVENT_LISTENER* p_event_listeners = Get_Listeners<_TEVENT_LISTENER_P>()(mp_local);M_TEVENT_LISTENER::iterator it = p_event_listeners->find(_event);if( p_event_listeners->end() != it){V_TEVENT_LISTENER* pv = &((*p_event_listeners)[_event]);V_TEVENT_LISTENER::iterator v_it = find(pv->begin(), pv->end(), _p_listener);if( pv->end() != v_it){ pv->erase(v_it);}if( pv->size() <= 0 ){ p_event_listeners->erase(it);}}}private:LOCAL_TYPE *mp_local;};template< class _T> struct Get_Listeners;template<> struct Get_Listeners<PASS_EVENT_LISTENER*>{ M_PASS_EVENT_LISTENER* operator()(LOCAL_TYPE *_p_local){ return &(_p_local->m_pass_event_listeners); }};template<> struct Get_Listeners<VOTE_EVENT_LISTENER*>{ M_VOTE_EVENT_LISTENER* operator()(LOCAL_TYPE *_p_local){ return &(_p_local->m_vote_event_listeners); }};template<> struct Get_Listeners<ACTION_EVENT_LISTENER*>{ M_ACTION_EVENT_LISTENER* operator()(LOCAL_TYPE *_p_local){ return &(_p_local->m_action_event_listeners); }};template<> struct Get_Listeners<RESPONSE_EVENT_LISTENER*>{ M_RESPONSE_EVENT_LISTENER* operator()(LOCAL_TYPE *_p_local){ return &(_p_local->m_response_event_listeners); }};M_PASS_EVENT_LISTENERm_pass_event_listeners;M_VOTE_EVENT_LISTENERm_vote_event_listeners;M_ACTION_EVENT_LISTENERm_action_event_listeners;M_RESPONSE_EVENT_LISTENERm_response_event_listeners;template<class _TMSG_LISTENER>friend class Get_Listeners;};}


 

#include <iostream>#include "Server_Lib.h"using namespace std;using namespace Server_Lib;struct p: public IPass_Event_Listener<>{virtual bool on_pass(Msg *_p_msg){cout<<"p"<<endl;return true;}};struct v: public IVote_Event_Listener<>{virtual bool on_vote(Msg *_p_msg){cout<<"v"<<endl;return false;}};struct a: public IAction_Event_Listener<>{virtual void on_action(Msg *_p_msg){cout<<"a"<<endl;}};struct r: public IResponse_Event_Listener<>{virtual void on_response(Msg *_p_msg){cout<<"r"<<endl;}};void main(){Msg_Server<> test;p p_lst;v v_lst;a a_lst;r r_lst;test.add_listener(1, &p_lst);test.add_listener(1, &v_lst);test.add_listener(1, &a_lst);test.add_listener(1, &r_lst);MsgHead msg_head;test.dispatch_pass_msg(1,&msg_head);test.dispatch_vote_msg(1,&msg_head);system("pause");}


 

热点排行