您的位置:首页 > 其它

学习基于 接口的消息模式

2015-12-01 20:00 323 查看
首先 ,需要监听消息的类要继承的接口:

/// <summary>
/// 消息监听接口 挂载在需要监听的类上 如UI类
/// </summary>
public interface IEventListener
{
/// <summary>
/// 处理消息
/// </summary>
/// <param name="id">消息ID</param>
/// <param name="param1"></param>
/// <param name="param2"></param>
/// <returns>是否终止消息派发</returns>
bool HandleEvent(int id , object param1 , object param2);

/// <summary>
///消息优先级
/// </summary>
/// <returns></returns>
int EventPriority();

}


然后是消息发送者要继承的消息管理

/*
作者: bambom    创建时间:
脚本: 这是一个脚本
*/

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class EventNote : MonoBehaviour
{

/// <summary>
/// 节点优先级
/// </summary>
public int EventNodePriority { set; get; }

/// <summary>
/// 所有消息集合
/// </summary>
private Dictionary<int , List<IEventListener>> mListener = new Dictionary<int , List<IEventListener>>();

/// <summary>
/// 消息节点
/// </summary>
private List<EventNote> mNodeList = new List<EventNote>();

/// <summary>
/// 挂载一个消息节点到当前的节点上
/// </summary>
/// <param name="node">消息节点</param>
/// <returns>如果节点上已经包含要添加的节点 返回false</returns>
public bool AttachEventNode(EventNote node)
{
if(node==null)
{
return false;
}
if(mNodeList.Contains(node))
{
return false;
}
int pos = 0;
for(int i=0;i<mNodeList.Count;i++)
{
if(node.EventNodePriority>mNodeList[i].EventNodePriority)
{
break;
}
pos++;
}
mNodeList.Insert(pos , node);
return true;
}

/// <summary>
/// 卸载一个消息节点
/// </summary>
/// <param name="node">消息节点</param>
/// <returns>如果节点不存在 就返回false</returns>
public bool DetachEventNode(EventNote node)
{
if(!mNodeList.Contains(node))
{
return false;
}
mNodeList.Remove(node);
return true;
}

/// <summary>
/// 挂载一个消息监听器到当前消息节点
/// </summary>
/// <param name="key">消息ID</param>
/// <param name="listener"> 消息监听器</param>
/// <returns></returns>
public bool AttachEventListener(int key , IEventListener listener)
{
if(listener==null)
{
return false;
}
if(!mListener.ContainsKey(key))
{
mListener.Add(key , new List<IEventListener>() { listener });
return true;
}
if(mListener[key].Contains(listener))
{
return false;
}
int pos = 0;
for(int i=0;i<mListener[key].Count;i++)
{
if(listener.EventPriority()>mListener[key][i].EventPriority())
{
break;
}
pos++;
}
mListener[key].Insert(pos , listener);
return true;
}

/// <summary>
/// 卸载一个消息节点
/// </summary>
/// <param name="key"></param>
/// <param name="listener"></param>
/// <returns> 如果当前消息节点不存在那么返回 false</returns>
public bool DetachEventListener(int key,IEventListener listener)
{
if(mListener.ContainsKey(key)&& mListener[key].Contains(listener))
{
mListener[key].Remove(listener);
return true;
}
return false;
}

public void SendEvent(int key,object param1=null,object param2=null)
{
DispatchEvent(key , param1 , param2);
}

/// <summary>
/// 派发消息到子消息节点以及自己节点下的监听器上
/// </summary>
/// <param name="key"><消息ID/param>
/// <param name="param1"></param>
/// <param name="param2"></param>
private bool DispatchEvent(int key , object param1 , object param2)
{
for(int i=0;i<mNodeList.Count;i++)
{
if(mNodeList[i].DispatchEvent(key,param1,param2))
return true;
}
return TriggerEvent(key , param1 , param2);
}

/// <summary>
/// 消息触发
/// </summary>
/// <param name="key">消息id</param>
/// <param name="param1"></param>
/// <param name="param2"></param>
/// <returns>是否中断</returns>
private bool TriggerEvent(int key , object param1 , object param2)
{
if (!this.gameObject.activeSelf || !this.gameObject.activeInHierarchy)//还要一个判定条件||!this.gameObject.
{
return false;
}
//当前消息集合里 不含有这条消息
if(!mListener.ContainsKey(key))
{
return false;
}
List<IEventListener> listeners=mListener[key];
for(int i=0;i<listeners.Count;i++)
{
if(listeners[i].HandleEvent(key,param1,param2))
return this;
}
return false;
}

/// <summary>
///
/// </summary>
void OnApplicationQuit()
{
mListener.Clear();
mNodeList.Clear();
}
}

测试:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: