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用来存放要传的数据,并且暴露了两个方法SetGet 用来设置要传递的数据和获取传过来的数据

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);