下面是一个消息通知中心的类,主要功能是监听事件。额外把 Notifier 抽象出来,可以同时添加多个监听事件。

  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
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using System.Collections.Generic;

/// <summary>
/// 消息通知中心.
/// </summary>
public class NotificationCenter
{
    private static NotificationCenter _instance;

    /// <summary>
    /// 获取单例.
    /// </summary>
    public static NotificationCenter GetInstance()
    {
        if(_instance == null)
        {
            _instance = new NotificationCenter();
        }
        return _instance;
    }

    private Dictionary<string, Notifier> _eventMap;

    /// <summary>
    /// 构造函数.
    /// </summary>
    private NotificationCenter()
    {
        _eventMap = new Dictionary<string, Notifier>();
    }

    /// <summary>
    /// 添加一个消息监听.
    /// </summary>
    /// <param name="name">消息名称.</param>
    /// <param name="handler">监听方法.</param>
    public void AddNotificationHandler(string name, EventHandler handler)
    {
        if(!_eventMap.ContainsKey(name))
        {
            _eventMap[name] = new Notifier();
        }
        _eventMap[name].AddEventHandler(handler);
    }

    /// <summary>
    /// 发送一个消息.
    /// </summary>
    /// <param name="name">消息名称.</param>
    public void SendNotification(string name)
    {
        this.SendNotification(name, null, EventArgs.Empty);
    }

    /// <summary>
    /// 发送一个消息.
    /// </summary>
    /// <param name="name">消息名称.</param>
    /// <param name="sender">消息发送者.</param>
    public void SendNotification(string name, object sender)
    {
        this.SendNotification(name, sender, EventArgs.Empty);
    }

    /// <summary>
    /// 发送一个消息.
    /// </summary>
    /// <param name="name">消息名称.</param>
    /// <param name="sender">消息发送者.</param>
    /// <param name="eventArgs">消息参数.</param>
    public void SendNotification(string name, object sender, EventArgs eventArgs)
    {
        if(_eventMap.ContainsKey(name))
        {
            _eventMap[name].Execute(sender, eventArgs);
        }
    }

    /// <summary>
    /// 移除一个消息监听.
    /// </summary>
    /// <param name="name">消息名称.</param>
    /// <param name="handler">监听方法.</param>
    public void RemoveNotificationHandler(string name, EventHandler handler)
    {
        if(_eventMap.ContainsKey(name))
        {
            _eventMap[name].RemoveEventHandler(handler);
        }
    }

    /// <summary>
    /// 如果一个特定名称的消息已经不会再使用同时没有任何监听, 可以调用该方法清除其占用的内存.
    /// </summary>
    /// <param name="name">消息名称.</param>
    public void ClearNotificationByName(string name)
    {
        if(_eventMap.ContainsKey(name))
        {
            _eventMap.Remove(name);
        }
    }
}

/// <summary>
/// 消息发送执行类.
/// </summary>
public class Notifier
{
    private event EventHandler _handler;

    /// <summary>
    /// 构造函数.
    /// </summary>
    public Notifier()
    {
    }

    /// <summary>
    /// 添加一个监听.
    /// </summary>
    /// <param name="handler">监听方法.</param>
    public void AddEventHandler(EventHandler handler)
    {
        _handler += handler;
    }

    /// <summary>
    /// 执行监听.
    /// </summary>
    /// <param name="sender">消息发送者.</param>
    /// <param name="eventArgs">消息参数.</param>
    public void Execute(object sender, EventArgs eventArgs)
    {
        if(_handler != null)
        {
            _handler(sender, eventArgs);
        }
    }

    /// <summary>
    /// 移除一个监听.
    /// </summary>
    /// <param name="handler">监听方法.</param>
    public void RemoveEventHandler(EventHandler handler)
    {
        _handler -= handler;
    }
}