通过事件来传递消息,降低代码的耦合度。
每一个事件码对应一种事件,通过广播事件码,来触发相应的事件
事件码通过枚举列举:
public enum EventType
{
ShowText,
//.......
}
自定义封装含不同参数的委托
//携带不同参数个数的委托(系统自带的Action 只有四个参数)
public delegate void CallBack();
public delegate void CallBack<T>(T arg);
public delegate void CallBack<T, X>(T arg1, X arg2);
public delegate void CallBack<T, X, Y>(T arg1, X arg2, Y arg3);
public delegate void CallBack<T, X, Y, Z>(T arg1, X arg2, Y arg3, Z arg4);
public delegate void CallBack<T, X, Y, Z, W>(T arg1, X arg2, Y arg3, Z arg4, W arg5);
消息中心:
/// <summary>
/// 事件中心
/// </summary>
public class EventCenter
{
//存放各种事件的字典
private static Dictionary<EventType, Delegate> m_EventTable = new Dictionary<EventType, Delegate>();
//精简代码
#region 精简
private static void OnListenerAdding(EventType eventType, Delegate callback)
{
if (!m_EventTable.ContainsKey(eventType))
{
m_EventTable.Add(eventType, null);
}
Delegate del = m_EventTable[eventType];
//判断该事件码对应的事件类型(参数)是否一样
if (del != null && del.GetType() != callback.GetType())
{
throw new Exception(string.Format("尝试添加事件失败"));
}
}
private static void OnListenerRemoving(EventType eventType, Delegate callback)
{
if (m_EventTable.ContainsKey(eventType))
{
Delegate del = m_EventTable[eventType];
if (del == null)
{
throw new Exception(string.Format("移除失败,对应事件为空"));
}
else if (del.GetType() != callback.GetType())
{
throw new Exception(string.Format("移除失败,对应事件不同"));
}
}
else
{
throw new Exception(string.Format("移除失败,事件码为空"));
}
}
private static void OnListenerRemoved(EventType eventType)
{
if (m_EventTable[eventType] == null)
{
m_EventTable.Remove(eventType);
}
}
#endregion
#region NoParamter
//添加事件
public static void AddListener(EventType eventType, CallBack callback)
{
OnListenerAdding(eventType, callback);
m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback;
}
//移除事件
public static void RemoveListener(EventType eventType, CallBack callback)
{
OnListenerRemoving(eventType, callback);
m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback;
OnListenerRemoved(eventType);
}
//事件的广播
public static void BroadCast(EventType eventType)
{
Delegate del;
if (m_EventTable.TryGetValue(eventType, out del))
{
CallBack callback = del as CallBack;
if (callback != null)
{
callback();
}
else
{
throw new Exception(string.Format("广播事件错误,对应事件为空"));
}
}
}
#endregion
#region One Paramter
//添加事件
public static void AddListener<T>(EventType eventType, CallBack<T> callback)
{
OnListenerAdding(eventType, callback);
m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] + callback;
}
//移除事件
public static void RemoveListener<T>(EventType eventType, CallBack<T> callback)
{
OnListenerRemoving(eventType, callback);
m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] - callback;
OnListenerRemoved(eventType);
}
//事件的广播
public static void BroadCast<T>(EventType eventType,T arg)
{
Delegate del;
if (m_EventTable.TryGetValue(eventType, out del))
{
CallBack<T> callback = del as CallBack<T>;
if (callback != null)
{
callback(arg);
}
else
{
throw new Exception(string.Format("广播事件错误,对应事件为空"));
}
}
}
#endregion
#region Two Paramters
//添加事件
public static void AddListener<T,X>(EventType eventType, CallBack<T,X> callback)
{
OnListenerAdding(eventType, callback);
m_EventTable[eventType] = (CallBack<T,X>)m_EventTable[eventType] + callback;
}
//移除事件
public static void RemoveListener<T,X>(EventType eventType, CallBack<T,X> callback)
{
OnListenerRemoving(eventType, callback);
m_EventTable[eventType] = (CallBack<T,X>)m_EventTable[eventType] - callback;
OnListenerRemoved(eventType);
}
//事件的广播
public static void BroadCast<T,X>(EventType eventType, T arg1,X arg2)
{
Delegate del;
if (m_EventTable.TryGetValue(eventType, out del))
{
CallBack<T,X> callback = del as CallBack<T,X>;
if (callback != null)
{
callback(arg1,arg2);
}
else
{
throw new Exception(string.Format("广播事件错误,对应事件为空"));
}
}
}
#endregion