消息中心
复制代码
public class EventManager : Singleton<EventManager>
{
/**
* 存储所有的消息
* 消息类型作key 委托类做值
*/
private Dictionary<TypeEvent, DelegateEvent> pool = new Dictionary<TypeEvent, DelegateEvent>();
/// <summary>
/// 注册消息方法
/// </summary>
/// <param name="type">消息类型</param>
/// <param name="handle">封装成委托的方法</param>
public void AddListener(TypeEvent type,DelegateEvent.Handle handle)
{
DelegateEvent temp;
if (pool.ContainsKey(type))//判断字典中是否有type类型的键值对
{
temp = pool[type];
}
else
{
temp = new DelegateEvent();//没有则新建一个添加进去
pool[type] = temp;
}
temp.AddListener(handle);//将handle注册到委托类中
}
/// <summary>
/// 注销消息方法
/// </summary>
/// <param name="type">消息类型</param>
/// <param name="handle">需要注销的方法</param>
public void RemoveListener(TypeEvent type, DelegateEvent.Handle handle)
{
if (pool.ContainsKey(type))
{
pool[type].RemoveListener(handle);
}
}
/// <summary>
/// 发行消息的方法
/// </summary>
/// <param name="type">消息类型</param>
/// <param name="data">方法执行时所需要的数据</param>
public void Send(TypeEvent type,object data)
{
if (!pool.ContainsKey(type))//判断如果没有对应的消息类型则直接返回
return;
EventData eventdata = new EventData();//数据类对象,将消息类型和传输的数据向上封装一层
eventdata.type = type;
eventdata.data = data;
pool[type].Send(eventdata);//执行所有回调方法
}
}
/// <summary>
/// 数据类存储了消息类型和发送的数据
/// 为了满足数据类型的多样性,对数据向上转型用object存储
/// 在回调方法中只需要将数据向下转型
/// 这么做的好处是可以传输任何类型的数据包括null
/// 还可以根据发送的消息类型做一个switc判断调用不同的函数
/// </summary>
public class EventData
{
public TypeEvent type;
public object data;
}
/// <summary>
/// 消息类型枚举,根据实际项目添加
/// </summary>
public enum TypeEvent
{
}
/// <summary>
/// 委托类
/// 将委托进行封装
/// 包含注册,注销,调用方法
/// </summary>
public class DelegateEvent
{
/**
* 自定义委托类型
* 参数使用数据类,此类可以满足任何类型的数据传输
*/
public delegate void Handle(EventData data);
public event Handle Handler;//委托实例
/// <summary>
/// 注册方法
/// </summary>
/// <param name="handle"></param>
public void AddListener(Handle handle)
{
if (handle != null)
{
Handler += handle;
}
}
/// <summary>
/// 注销方法
/// </summary>
/// <param name="handle"></param>
public void RemoveListener(Handle handle)
{
if (handle != null)
{
Handler -= handle;
}
}
/// <summary>
/// 执行方法
/// </summary>
/// <param name="data">执行回调方法所需要的数据</param>
public void Send(EventData data)
{
Handler?.Invoke(data);
}
}
版权声明:本文为Over_The_Clouds原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。