C# 事件系统(二)

  前面已经说过了大概的设计思路.现在开始实现事件系统.所谓的事件系统,其实是一个事件集合.将事件存放一处统一管理.

  事件是一对多的关系,我也选择了用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之后在补齐触发即可.后面就开始实现事件.

 

传送门:

    C# 事件系统(一)

    C# 事件系统(二)

    C# 事件系统(三)

C# 事件系统(二)

上一篇:在.NET 框架中使用 C# 8 和可空引用类型


下一篇:POJ3126 Prime Path