0%

简单的事件中心

下面给出一个简单的事件中心的实现

首先是事件类型

1
2
3
4
5
6
7
8
/// <summary>
/// 事件类型
/// </summary>
public enum EventType
{
Speed,Frozen,Pause,UnPause,Dash,GameOver
}

然后是事件中心

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;

/// <summary>
/// 事件中心,负责注册、发布事件
/// </summary>
public class EventCenter
{

private static EventCenter _instance = null;
public static EventCenter Instance
{
get
{
if (_instance == null)
{
_instance = new EventCenter();
}

return _instance;
}
}

private Dictionary<EventType, List<Action>> eventDict = new Dictionary<EventType, List<Action>>();

private EventCenter() { }//私有构造函数,防止外部实例化

/// <summary>
/// 订阅事件
/// </summary>
/// <param name="eventType">事件类型</param>
/// <param name="eventHandler">事件处理方法</param>
public void SubscribeEvent(EventType eventType, Action eventHandler)
{
if (eventDict.ContainsKey(eventType))
{
eventDict[eventType].Add(eventHandler);
}
else
{
List<Action> list = new List<Action>();
list.Add(eventHandler);
eventDict.Add(eventType, list);
}
}

/// <summary>
/// 取消订阅事件
/// </summary>
/// <param name="eventType">事件类型</param>
/// <param name="eventHandler">事件处理方法</param>
public void RemoveSubscribedEvent(EventType eventType, Action eventHandler)
{
if(eventDict.ContainsKey(eventType))
{
eventDict[eventType].Remove(eventHandler);
}
}

/// <summary>
/// 发布事件
/// </summary>
/// <param name="eventType">事件类型</param>
public void PublishEvent(EventType eventType)
{
if (eventDict.ContainsKey(eventType))
{
foreach (Action handler in eventDict[eventType])
{
handler?.Invoke();
}
}
}
}

欢迎关注我的其它发布渠道