简单发送事件: EgoEventCenter.PostEvent("Test");
发送string类型事件: EgoEventCenter.PostEvent("Test","data");
发送多个参数事件: EgoEventCenter.PostEvent("Test", 1, 2f);
监听事件: EgoEventCenter.AddListener("Test",OnTestHandle);
监听带参数的事件: EgoEventCenter.AddListener("Test",OnTestHandle);
移除事件: EgoEventCenter.RemoveListener("Test",OnTestHandle);
移除所有监听事件: EgoEventCenter.RemoveEvent("Test");
移除事件中心的所有事件: EgoEventCenter.RemoveAllEvent();
正常情况我们调用一个类里面的方法,一般都是访问类,然后调用里面的方法,比如
public class TestClass
{
public void Excute()
{
}
}
void Test()
{
TestClass test=new TestClass();
test.Excute();
}
如果使用事件中心的话,就变成了
public class TestClass
{
public TestClass()
{
EgoEventCenter.AddListener("Test",Excute);
}
public void Excute()
{
Debug.Log("执行了!");
}
}
void Test()
{
//TestClass test=new TestClass();
//test.Excute();
EgoEventCenter.PostEvent("Test");
}
这样的好处就是,减少了耦合, 要执行TestClass的函数,就不用对TestClass产生了依赖,如果TestClass变成了别的逻辑,只要他监听了事件中心的事件,程序就不会有任何的逻辑问题。这样带来的好处程序更加容易维护。
#region 文件信息
/***************************************
** 文件名: EgoEventCenter
** 版 权: (C) egogame
** 创建人: 鱼蛋
** 日 期: 2020.07
** 描 述: 事件中心
***************************************/
#endregion
using System;
using System.Collections.Generic;
public static class EgoEventCenter{
public delegate void EventHandle();
public delegate void EventHandle(T value);
public delegate void EventHandle(T1 value1,T2 value2);
public delegate void EventHandle(T1 value1,T2 value2,T3 value3);
static Dictionary eventHandles;
///
/// 发送事件
///
/// 事件名
[Obsolete("已过时,请使用PostEvent函数")]
public static void SendEvent(string eventName)
{
PostEvent(eventName);
}
///
/// 发送事件
///
/// 事件名
/// 数据
[Obsolete("已过时,请使用PostEvent函数")]
public static void SendEvent(string eventName,object value)
{
PostEvent(eventName, value);
}
///
/// 发送事件
///
/// 事件名
public static void PostEvent(string eventName){
if (eventHandles == null) return;
Delegate d;
if (eventHandles.TryGetValue(eventName, out d))
{
if (d == null) return;
EventHandle call = d as EventHandle;
if (call != null)
{
call();
}
else if (d is EventHandle)
{
//兼容之前旧版本EgoEventCenter逻辑
EventHandle call2 = d as EventHandle;
call2(null);
}
else
{
throw new Exception(string.Format("事件{0}包含着不同类型的委托", eventName));
}
}
}
///
/// 发送事件
///
///
///
///
public static void PostEvent(string eventName,T value)
{
if (eventHandles == null) return;
Delegate d;
if (eventHandles.TryGetValue(eventName, out d))
{
if (d == null) return;
EventHandle call = d as EventHandle;
if (call != null)
{
call(value);
}
else
{
throw new Exception(string.Format("事件{0}包含着不同类型的委托{1}", eventName, d.GetType()));
}
}
}
///
/// 发送事件
///
///
///
///
///
///
public static void PostEvent(string eventName,T1 value1,T2 value2)
{
if (eventHandles == null) return;
Delegate d;
if (eventHandles.TryGetValue(eventName, out d))
{
if (d == null) return;
EventHandle call = d as EventHandle;
if (call != null)
{
call(value1, value2);
}
else
{
throw new Exception(string.Format("事件{0}包含着不同类型的委托{1}", eventName, d.GetType()));
}
}
}
///
/// 发送事件
///
///
///
///
///
///
///
///
public static void PostEvent(string eventName,T1 value1,T2 value2,T3 value3)
{
if (eventHandles == null) return;
Delegate d;
if (eventHandles.TryGetValue(eventName, out d))
{
if (d == null) return;
EventHandle call = d as EventHandle;
if (call != null)
{
call(value1, value2, value3);
}
else
{
throw new Exception(string.Format("事件{0}包含着不同类型的委托{1}", eventName, d.GetType()));
}
}
}
///
/// 监听事件
///
/// 事件名
/// 回调
public static void AddListener(string eventName,EventHandle handle){
OnListeningAdd(eventName, handle);
eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
}
///
/// 监听事件
///
/// 事件名
/// 回调
public static void AddListener(string eventName,EventHandle handle){
OnListeningAdd(eventName, handle);
eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
}
///
/// 监听事件
///
///
///
///
public static void AddListener(string eventName, EventHandle handle)
{
OnListeningAdd(eventName, handle);
eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
}
///
/// 监听事件
///
///
///
///
///
public static void AddListener(string eventName, EventHandle handle)
{
OnListeningAdd(eventName, handle);
eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
}
///
/// 监听事件
///
///
///
///
///
///
public static void AddListener(string eventName, EventHandle handle)
{
OnListeningAdd(eventName, handle);
eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
}
///
/// 移除事件监听
///
/// 事件名
/// 回调
[Obsolete("已过时,请使用RemoveListener函数")]
public static void RemoveHandle(string eventName,EventHandle handle)
{
RemoveListener(eventName, handle);
}
///
/// 移除事件监听
///
/// 事件名
/// 回调
[Obsolete("已过时,请使用RemoveListener函数")]
public static void RemoveHandle(string eventName,EventHandle handle)
{
RemoveListener(eventName, handle);
}
///
/// 移除事件监听
///
/// 事件名
/// 回调
public static void RemoveListener(string eventName,EventHandle handle){
if (eventHandles == null) {
return;
}
if (!eventHandles.ContainsKey(eventName)) return;
OnListeningRemove(eventName, handle);
eventHandles[eventName] = (EventHandle)eventHandles[eventName] - handle;
}
///
/// 移除事件监听
///
/// 事件名
/// 回调
public static void RemoveListener(string eventName,EventHandle handle)
{
RemoveListener(eventName, handle);
}
///
/// 移除事件监听
///
/// 事件名
///
public static void RemoveListener(string eventName,EventHandle handle){
if (eventHandles == null) {
return;
}
if (!eventHandles.ContainsKey(eventName)) return;
OnListeningRemove(eventName, handle);
eventHandles[eventName] = (EventHandle)eventHandles[eventName] - handle;
}
///
/// 移除事件监听
///
/// 事件名
///
public static void RemoveListener(string eventName,EventHandle handle){
if (eventHandles == null) {
return;
}
if (!eventHandles.ContainsKey(eventName)) return;
OnListeningRemove(eventName, handle);
eventHandles[eventName] = (EventHandle)eventHandles[eventName] - handle;
}
///
/// 移除事件监听
///
/// 事件名
///
public static void RemoveListener(string eventName,EventHandle handle){
if (eventHandles == null) {
return;
}
if (!eventHandles.ContainsKey(eventName)) return;
OnListeningRemove(eventName, handle);
eventHandles[eventName] = (EventHandle)eventHandles[eventName] - handle;
}
///
/// 移除事件
///
///
public static void RemoveEvent(string eventName)
{
Internal_RemoveEvent(eventName, true);
}
static void Internal_RemoveEvent(string eventName,bool removeFromDic)
{
if (eventHandles == null) {
return;
}
if (eventHandles.ContainsKey(eventName))
{
var callback = eventHandles[eventName];
Delegate[] invokeList = callback.GetInvocationList();
foreach (var invokeItem in invokeList)
{
Delegate.Remove(callback, invokeItem);
}
if(removeFromDic) eventHandles.Remove(eventName);
}
}
static void OnListeningAdd(string eventName, Delegate callback)
{
if (eventHandles == null)
eventHandles = new Dictionary ();
if (!eventHandles.ContainsKey(eventName))
{
eventHandles.Add(eventName, null);
}
Delegate d = eventHandles[eventName];
if (d != null && d.GetType() != callback.GetType())
{
throw new Exception(string.Format("尝试添加两种不同类型的委托,委托1为{0},委托2为{1}", d.GetType(), callback.GetType()));
}
}
static void OnListeningRemove(string eventName, Delegate callback)
{
if (eventHandles.ContainsKey(eventName))
{
Delegate d = eventHandles[eventName];
if (d!=null && d.GetType() != callback.GetType())
{
throw new Exception(string.Format("尝试移除不同类型的事件,事件名{0},已存储的委托类型{1},当前事件委托{2}", eventName, d.GetType(), callback.GetType()));
}
}
else
{
throw new Exception(string.Format("没有事件名{0}", eventName));
}
}
///
/// 移除所有事件
///
public static void RemoveAllEvent()
{
if (eventHandles==null)
{
return;
}
foreach (var keyValuePair in eventHandles)
{
Internal_RemoveEvent(keyValuePair.Key, false);
}
eventHandles.Clear();
}
}
整个类附上,直接按上面的用法就行。完全原创,请珍惜我掉的头发...