前面已经说过了大概的设计思路.现在开始实现事件系统.所谓的事件系统,其实是一个事件集合.将事件存放一处统一管理.
事件是一对多的关系,我也选择了用string表示事件.用HashSet来存储多个委托.那这种Key/Value的集合自然选择字典存储.这里我们还没有讨论委托的具体设计.我们先用一个类EventMethod来代表.
实现起来代码如下.
/// <summary> /// 事件系统 /// </summary> public class EventSystem { #region Field /// <summary> /// 事件容器 /// </summary> private readonly Dictionary<string, HashSet<EventMethod>> events = new Dictionary<string, HashSet<EventMethod>>(); #endregion #region Method /// <summary> /// 添加事件 /// </summary> /// <param name="eventMethod"></param> public bool Add(EventMethod eventMethod) { //事件方法集合可能在刚判断存在,但是在另外一个线程中马上被删除.所以这里重试5次 for (int i = 0; i < 5; i++) { //创建事件方法集合 if (!events.ContainsKey(eventMethod.Handle)) { lock (events) { if (!events.ContainsKey(eventMethod.Handle)) events.Add(eventMethod.Handle, new HashSet<EventMethod>()); } } //添加事件方法到集合中 if (events.TryGetValue(eventMethod.Handle, out var hashSet)) return hashSet.Add(eventMethod); } return false; //throw new Exception($"添加事件{eventMethod.Handle}失败!"); } /// <summary> /// 移除事件 /// </summary> /// <param name="eventMethod"></param> public void Remove(EventMethod eventMethod) { if (events.TryGetValue(eventMethod.Handle, out var hashSet)) { hashSet.Remove(eventMethod); //移除已经空置的事件方法集合 if (hashSet.Count <= 0) events.Remove(eventMethod.Handle); } }#endregion }
EventMethod中有个属性Hnadle来代表他是哪种事件的委托.这样在添加到实现系统时会将它添加到对应的事件方法集合中.移除同理.
一个简单的事件容器就设计好了.当然现在还不能触发,我们在设计好EventMethod之后在补齐触发即可.后面就开始实现事件.