AS3消息机

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.DefineBag
{
	import flash.utils.Dictionary;

	public interface IMsgListener
	{
		function OnEvt( _evt:Object ):Boolean;
	}
}


/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.DefineBag
{
	import flash.utils.Dictionary;

	public interface IMsgServer
	{
		function AddListener( _msg:String, _lst:IMsgListener ):Boolean;
		function RemoveListener( _msg:String, _lst:IMsgListener ):void;
		function DispatchEvt( _msg:String, _evt:Object ):Boolean;
	}
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.DefineBag
{
	import flash.utils.Dictionary;

	public interface IMsgSvrManager
	{
		function AddListener( _msg:String, _lst_type:int, _lst:IMsgListener ):Boolean;
		function RemoveListener( _msg:String, _lst_type:int, _lst:IMsgListener ):void;
		function DispatchEvt( _msg:String, _evt:Object ):void;
	}
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.MsgListen
{
	import MsgServer.DefineBag.IMsgListener;
	import MsgServer.MsgServerBag.MsgServerManagerHelper;
	
	public class ActionHelper extends BaseEvtHelper
	{
		public function ActionHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null )
		{
			super(_msg_svr, _msg, _callback, _condition);
		}
		
		public function Init() : Boolean
		{
			return m_msg_svr.GetSvr().AddListener(m_msg, m_msg_svr.ACTION, this);
		}
		
		public function Uninit() : void
		{
			m_msg_svr.GetSvr().RemoveListener(m_msg, m_msg_svr.ACTION, this);
		}
		
		public override function OnEvt( _buf:Object ):Boolean
		{
			if( null != m_condition && null != _buf )
			{
				var sign:String = "";
				for( sign in m_condition )
				{
					if( m_condition[sign] != _buf[sign] )
					{
						return true;
					}
				}
			}
			m_fun(_buf);
			return true;
		}
	};
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.MsgListen
{
	import MsgServer.DefineBag.IMsgListener;
	import MsgServer.MsgServerBag.MsgServerManagerHelper;

	public class BaseEvtHelper implements IMsgListener
	{
		protected var m_msg_svr:MsgServerManagerHelper = null;
		protected var m_msg:String = "";
		protected var m_fun:Function = null;
		protected var m_condition:Object = null;
		public function BaseEvtHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null )
		{
			m_msg_svr = _msg_svr;
			m_msg = _msg;
			m_fun = _callback;
			m_condition = _condition;
		}
		
		public function OnEvt( _buf:Object ):Boolean{ return true; }
	}
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.MsgListen
{
	import MsgServer.DefineBag.IMsgListener;
	import MsgServer.MsgServerBag.MsgServerManagerHelper;

	public class VoteHelper extends BaseEvtHelper
	{
		public function VoteHelper( _msg_svr:MsgServerManagerHelper, _msg:String, _callback:Function, _condition:Object = null )
		{
			super(_msg_svr, _msg, _callback, _condition);
		}
		
		public function Init() : Boolean
		{
			return m_msg_svr.GetSvr().AddListener(m_msg, m_msg_svr.VOTE, this);
		}
		
		public function Uninit() : void
		{
			m_msg_svr.GetSvr().RemoveListener(m_msg, m_msg_svr.VOTE, this);
		}
		
		public override function OnEvt( _buf:Object ):Boolean
		{
			if( null != m_condition && null != _buf )
			{
				var sign:String = "";
				for( sign in m_condition )
				{
					if( m_condition[sign] != _buf[sign] )
					{
						return false;
					}
				}
			}
			return m_fun(_buf);
		}
	};
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.MsgServerBag
{
	import MsgServer.DefineBag.IMsgListener;
	
	import flash.utils.Dictionary;

	public class ActionMsgSvr extends BaseMsgSvr
	{
		protected override function DoDispatchEvt( _msg:String, _evt:Object ):Boolean
		{
			++run_count;
			var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
			for( var id:int = 0, len:int = msg_lst.length; id < len; ++id )
			{
				if( null != msg_lst[id] )
				{
					msg_lst[id].OnEvt(_evt)
				}
				if( null == msg_lst[id] )
				{
					had_null_node = true;
				}
			}
			--run_count;
			return true;
		}
	}
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.MsgServerBag
{
	import MsgServer.DefineBag.IMsgListener;
	import MsgServer.DefineBag.IMsgServer;
	
	import flash.utils.Dictionary;

	public class BaseMsgSvr implements IMsgServer
	{
		private const IS_DEBUG:Boolean = false;
		protected var m_msg_table:Dictionary = new Dictionary();
		public function AddListener( _msg:String, _lst:IMsgListener ):Boolean
		{
			if( null == m_msg_table[_msg] )
				m_msg_table[_msg] = new Vector.<IMsgListener>();
			var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
			if( IS_DEBUG )
			{
				var i:int = msg_lst.indexOf(_lst);
				if( -1 != i )
				{
					trace("<--------------  警告!!!  相同对象相同监听执行多次! -------------->");
					return false;
				}
			}
			msg_lst.push(_lst);
			return true;
		}
		
		public function RemoveListener( _msg:String, _lst:IMsgListener ):void
		{
			if( null != m_msg_table[_msg] )
			{
				var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
				var i:int = msg_lst.indexOf(_lst);
				if( -1 != i )
				{
					msg_lst[i] = null;
				}
			}
		}
		
		private var msg_backups:Vector.<IMsgListener> = new Vector.<IMsgListener>();
		protected var run_count:int = 0;
		protected var had_null_node:Boolean = false;
		public function DispatchEvt( _msg:String, _evt:Object ):Boolean
		{
			if( null != m_msg_table[_msg] )
			{
				if( run_count >= 10 )
				{
					trace("消息相互调用超过10层,极有可能是游戏逻辑的实现有BUG!");
				}
				var ret:Boolean = DoDispatchEvt(_msg, _evt);
				if( 0 == run_count && had_null_node  )
				{
					//非递归层的情况,才进行清理垃圾操作的结点
					var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
					for( var id:int = 0, len:int = msg_lst.length; id < len; ++id )
					{
						if( null != msg_lst[id] )
							msg_backups.push(msg_lst[id]);
					}
					var msg_temp:Vector.<IMsgListener> = m_msg_table[_msg];
					m_msg_table[_msg] = msg_backups;
					msg_backups = msg_temp;
					msg_backups.splice(0, msg_backups.length);
					had_null_node = false;
				}
				return ret;
			}
			return true;
		}
		
		protected function DoDispatchEvt( _msg:String, _evt:Object ):Boolean
		{
			return true;
		}
	}
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.MsgServerBag
{
	public class MsgServerManagerHelper
	{
		public const VOTE:int 	= 1;
		public const INIT:int 	= 2;
		public const ACTION:int = 3;
		public const UNINIT:int = 4;
		private var g_msg_svr_mng:MsgSvrManager 	= new MsgSvrManager();
		private var g_vote_msg_svr:VoteMsgSvr 		= new VoteMsgSvr();
		private var g_init_msg_svr:ActionMsgSvr 	= new ActionMsgSvr();
		private var g_action_msg_svr:ActionMsgSvr 	= new ActionMsgSvr();
		private var g_uninit_msg_svr:ActionMsgSvr 	= new ActionMsgSvr();
		
		public function Init():void
		{
			g_msg_svr_mng.PushSvr(VOTE, g_vote_msg_svr);
			g_msg_svr_mng.PushSvr(INIT, g_init_msg_svr);
			g_msg_svr_mng.PushSvr(ACTION, g_action_msg_svr);
			g_msg_svr_mng.PushSvr(UNINIT, g_uninit_msg_svr);
		}
		
		public function UnInit():void
		{
			g_msg_svr_mng.Clear();
		}
		
		public function GetSvr():MsgSvrManager
		{
			return g_msg_svr_mng;
		}
	}
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.MsgServerBag
{
	import MsgServer.DefineBag.IMsgListener;
	import MsgServer.DefineBag.IMsgServer;
	import MsgServer.DefineBag.IMsgSvrManager;
	
	import flash.utils.Dictionary;

	public class MsgSvrManager implements IMsgSvrManager
	{
		private var svr_vct:Vector.<MakePair> = new Vector.<MakePair>();
		
		public function PushSvr( _sign:int,  _msg_svr:IMsgServer ):void
		{
			var lst:MakePair = new MakePair(_sign, _msg_svr);
			svr_vct.push(lst);
		}
		
		public function Clear():void
		{
			svr_vct.splice(0,svr_vct.length);
		}
		
		public function AddListener( _msg:String, _lst_type:int, _lst:IMsgListener ):Boolean
		{
			for( var id:int = 0, len:int = svr_vct.length; id < len; ++id )
			{
				var node:MakePair = svr_vct[id];
				if( node.SIGN == _lst_type )
				{
					return node.MSG_SVR.AddListener(_msg, _lst);
				}				
			}
			return false;
		}
		
		public function RemoveListener( _msg:String, _lst_type:int, _lst:IMsgListener ):void
		{
			for( var id:int = 0, len:int = svr_vct.length; id < len; ++id )
			{
				var node:MakePair = svr_vct[id];
				if( node.SIGN == _lst_type )
				{
					return node.MSG_SVR.RemoveListener(_msg, _lst);
				}				
			}
		}
		
		public function DispatchEvt( _msg:String, _evt:Object ):void
		{
			for( var id:int = 0, len:int = svr_vct.length; id < len; ++id )
			{
				var node:MakePair = svr_vct[id];
				if( false == node.MSG_SVR.DispatchEvt(_msg, _evt) )
				{
					return;
				}				
			}
		}
	}
}


import MsgServer.DefineBag.IMsgServer;
class MakePair
{
	public var SIGN:int = 0;
	public var MSG_SVR:IMsgServer = null;
	public function MakePair( _sign:int,  _msg_svr:IMsgServer ):void
	{
		SIGN = _sign;
		MSG_SVR = _msg_svr;
	}
}

/**
 * VERSION: 3
 * DATE: 2013-10-12
 * CLK/陈泽丹
 **/
package MsgServer.MsgServerBag
{
	import MsgServer.DefineBag.IMsgListener;
	
	import flash.utils.Dictionary;
	
	public class VoteMsgSvr extends BaseMsgSvr
	{
		protected override function DoDispatchEvt( _msg:String, _evt:Object ):Boolean
		{
			++run_count;
			var ret:Boolean = true;
			var temp:Boolean = false;
			var msg_lst:Vector.<IMsgListener> = m_msg_table[_msg];
			for( var id:int = 0, len:int = msg_lst.length; id < len; ++id )
			{
				if( null != msg_lst[id] )
				{
					temp = msg_lst[id].OnEvt(_evt)
				}
				if( null == msg_lst[id] )
				{
					had_null_node = true;
				}
				if( temp )
				{
					break;
				}
			}
			--run_count;
			return ret;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值