C#构建一个全局的事件管理器
管理器有两个主要部分组成
- 1.EventManager
- 2.DataArgs
EventManager类
EventManager 是事件管理器的核心类,采用单例模式实现,有三个主要的成员方法,负责事件的添加,删除和触发。
AddEventListener
添加事件RemoveEventListenter
删除事件EventFire
触发事件
事件保存在一个字典eventsDict中, 以事件的名称作为字典的key,Value是一个列表,用来保存要触发执行方法
public class EventManager
{
private Dictionary<string, List<Action<DataArgs>>> eventsDict = new Dictionary<string, List<Action<DataArgs>>>();
private static EventManager instance = null;
public static EventManager Instance
{
get
{
if(instance == null)
{
instance = new EventManager();
}
return instance;
}
}
public void AddEventListener(string eventName, Action<DataArgs> func)
{
if (eventsDict.ContainsKey(eventName) && eventsDict[eventName].Contains(func))
{
Debug.WriteLine("event aready exist eventName=" + eventName + ", func=" + func.Method.Name);
return;
}
if (!eventsDict.ContainsKey(eventName))
{
eventsDict.Add(eventName, new List<Action<DataArgs>>());
}
List<Action<DataArgs>> list = eventsDict[eventName];
list.Add(func);
}
public void RemoveEventListenter(string eventName, Action<DataArgs> func)
{
if (!eventsDict.ContainsKey(eventName)) { return; }
eventsDict[eventName].Remove(func);
}
public void EventFire(string eventName, DataArgs arg)
{
if (!eventsDict.ContainsKey(eventName))
{
Debug.WriteLine("event doesn't add yet! eventName=" + eventName);
return;
}
List<Action<DataArgs>> list = eventsDict[eventName];
for (int i = 0; i < list.Count; i++)
{
list[i](arg);
}
}
}
DataArgs 事件传递的参数数据
DataArgs 有一个数据字典data用来存放要传的数据,并且暴露了两个方法Set 和 Get 用来设置要传递的数据和获取传过来的数据
public class DataArgs
{
private Dictionary<string, object> data = new Dictionary<string, object>();
public void Set(string key, object value)
{
if (data.ContainsKey(key))
{
data[key] = value;
}
else
{
data.Add(key, value);
}
}
public object Get(string key)
{
object value;
data.TryGetValue(key, out value);
return value;
}
}
添加一个静态类CommonEvent 来定义事件
public static class CommonEvent
{
public static string ON_GENERATE_BALL_EVENT = "ON_GENERATE_BALL";
public static string ON_RESET_BALLMACHINE_EVENT = "ON_RESET_BALLMACHINE";
public static string ON_RANDOM_TICK_EVENT = "ON_RANDOM_TICK_EVENT";
public static string ON_GENERATE_BALL_TICK_EVENT = "ON_GENERATE_BALL_TICK_EVENT";
public static string ON_GET_RESULT_EVENT = "ON_GET_RESULT_EVENT";
}
用法举例
注册事件
- 1.采用lambda表达式,适合永久监听的事件,因为没有办法移除掉
EventManager.Instance.AddEventListener(CommonEvent.ON_GENERATE_BALL_EVENT, (data) =>
{
GenerateBall();
});
- 2.函数传参, 把已有的函数作为参数
protected void InitEvents()
{
EventManager.Instance.AddEventListener(CommonEvent.ON_RANDOM_TICK_EVENT, this.OnRandomBallTick);
EventManager.Instance.AddEventListener(CommonEvent.ON_GENERATE_BALL_TICK_EVENT, this.OnGenerateBallTick);
EventManager.Instance.AddEventListener(CommonEvent.ON_GET_RESULT_EVENT, this.OnGetResult);
}
删除事件
protected void Release()
{
EventManager.Instance.RemoveEventListenter(CommonEvent.ON_RANDOM_TICK_EVENT, this.OnRandomBallTick);
EventManager.Instance.RemoveEventListenter(CommonEvent.ON_GENERATE_BALL_TICK_EVENT, this.OnGenerateBallTick);
EventManager.Instance.RemoveEventListenter(CommonEvent.ON_GET_RESULT_EVENT, this.OnGetResult);
}
触发事件
- 1.不传参数
EventManager.Instance.EventFire(CommonEvent.ON_GENERATE_BALL_EVENT, null);
- 2.传参数
DataArgs randomTickData = new DataArgs();//主要是为了避免频繁的new操作
randomTickData.Set("randomIndex", randomIndex);
randomTickData.Set("randomNum", randomNum);
EventManager.Instance.EventFire(CommonEvent.ON_RANDOM_TICK_EVENT, randomTickData);
希望它能帮到你或者帮你找到思路(^_^)选个表情,或者留个评论吧!