using GFramework.Core.Abstractions.events; namespace GFramework.Core.events; /// /// 支持优先级的泛型事件类 /// /// 事件回调函数的参数类型 public class PriorityEvent : IEvent { /// /// 事件处理器包装类,包含处理器和优先级 /// private class EventHandler { public Action Handler { get; } public int Priority { get; } public EventHandler(Action handler, int priority) { Handler = handler; Priority = priority; } } /// /// 存储已注册的事件处理器列表 /// private readonly List _handlers = new(); /// /// 标记事件是否已被处理(用于 UntilHandled 传播模式) /// private bool _handled; /// /// 显式实现 IEvent 接口中的 Register 方法 /// /// 无参事件处理方法 /// IUnRegister 对象,用于稍后注销该事件监听器 IUnRegister IEvent.Register(Action onEvent) { return Register(_ => onEvent(), 0); } /// /// 注册一个事件监听器,默认优先级为 0 /// /// 要注册的事件处理方法 /// IUnRegister 对象,用于稍后注销该事件监听器 public IUnRegister Register(Action onEvent) { return Register(onEvent, 0); } /// /// 注册一个事件监听器,并指定优先级 /// /// 要注册的事件处理方法 /// 优先级,数值越大优先级越高 /// IUnRegister 对象,用于稍后注销该事件监听器 public IUnRegister Register(Action onEvent, int priority) { var handler = new EventHandler(onEvent, priority); _handlers.Add(handler); // 按优先级降序排序(高优先级在前) _handlers.Sort((a, b) => b.Priority.CompareTo(a.Priority)); return new DefaultUnRegister(() => UnRegister(onEvent)); } /// /// 取消指定的事件监听器 /// /// 需要被注销的事件处理方法 public void UnRegister(Action onEvent) { _handlers.RemoveAll(h => h.Handler == onEvent); } /// /// 触发所有已注册的事件处理程序(默认传播模式:All) /// /// 传递给事件处理程序的参数 public void Trigger(T t) { Trigger(t, EventPropagation.All); } /// /// 触发事件处理程序,并指定传播模式 /// /// 传递给事件处理程序的参数 /// 事件传播模式 public void Trigger(T t, EventPropagation propagation) { _handled = false; switch (propagation) { case EventPropagation.All: // 触发所有处理器 foreach (var handler in _handlers) { handler.Handler.Invoke(t); } break; case EventPropagation.UntilHandled: // 触发直到某个处理器标记为已处理 foreach (var handler in _handlers) { handler.Handler.Invoke(t); if (_handled) break; } break; case EventPropagation.Highest: // 仅触发最高优先级的处理器 if (_handlers.Count > 0) { var highestPriority = _handlers[0].Priority; foreach (var handler in _handlers) { if (handler.Priority < highestPriority) break; handler.Handler.Invoke(t); } } break; } } /// /// 标记事件为已处理(用于 UntilHandled 传播模式) /// public void MarkAsHandled() { _handled = true; } }