最近在看Prism源码,统筹处理整个程序中的事件用到的是IEventAggregator接口。
这里简化一下,很典型的观察者模式学习资料。
EventBase.cs
public abstract class EventBase
{
// List中维护了所有的监听对象,这里的监听者具体表现为Action
private readonly List<Action> m_subscriptions = new List<Action>();
public void Subscribe(Action action)
{
m_subscriptions.Add(action);
}
public void Unsubscribe(Action action)
{
m_subscriptions.Remove(action);
}
public void Publish()
{
foreach (var action in m_subscriptions)
{
action();
}
}
}
PubEvent.cs
public class PubEvent : EventBase
{
}
EventBus.cs
public class EventBus
{
private EventBus() { }
// 使用静态变量,保证每一种事件类型即使被调用多次,也还是同一个实例
private static readonly Dictionary<Type, EventBase> m_events = new Dictionary<Type, EventBase>();
public static TEventType GetEvent<TEventType>() where TEventType : EventBase, new()
{
lock (m_events)
{
EventBase existingEvent = null;
if (!m_events.TryGetValue(typeof(TEventType), out existingEvent))
{
TEventType newEvent = new TEventType();
m_events[typeof(TEventType)] = newEvent;
return newEvent;
}
else
{
return (TEventType)existingEvent;
}
}
}
}
使用:
internal class Program
{
static void Main(string[] args)
{
var pubEvent = EventBus.GetEvent<PubEvent>();
Console.WriteLine("注册");
pubEvent.Subscribe(Say);
Console.WriteLine("注册");
pubEvent.Subscribe(Cry);
pubEvent.Publish();
Console.WriteLine("注销");
pubEvent.Unsubscribe(Say);
pubEvent.Publish();
Console.ReadLine();
}
private static void Say()
{
Console.WriteLine("say");
}
private static void Cry()
{
Console.WriteLine("cry");
}
}
输出结果:
注册
注册
say
cry
注销
cry