简介
事件总线
是对 发布-订阅模式 的一种实现,他是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要互相依赖,达到一种解耦的目的。
事件本质
事件
是由事件源
和事件处理
组成,是对消息的封装,是IDE编程环境为了简化编程而提供的有用的工具。
发布订阅模式
定义
定义对象间一种 一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
角色
- 发布方(Publisher): 也称为
被观察者
,当状态改变时负责通知所有订阅者。 - 订阅方(Subscriber):也称为
观察者
,订阅事件并对接收到的事件进行处理。
实现方式
- 简单的实现方式:由
Publisher
维护一个订阅者列表,当状态改变时循环遍历列表通知订阅者。 - 委托的实现方式:由
Publisher
定义事件委托,Subscriber
实现委托。
发布订阅模式中有两个关键字,通知和更新。 被观察者状态改变通知观察者做出相应更新。 解决的是当对象改变时需要通知其他对象做出相应改变的问题。
实现事件总线
提取事件源
抽象一个接口IEvent
,用于封装事件。可以是一个空的标识接口,也可以包括EventSource
和 EventTime
。
1 | /// <summary> |
提取事件处理器
需要抽象出一个IEventHandler
,用于抽象事件处理器,包含一个Handler
方法。1
2
3
4
5
6
7
8
9
10
11
12/// <summary>
/// 泛型事件处理器接口
/// </summary>
/// <typeparam name="TEventData"></typeparam>
public interface IEventHandler<TEventData> : IEventHandler where TEventData : IEvent
{
/// <summary>
/// 事件处理器实现该方法来处理事件
/// </summary>
/// <param name="event"></param>
void HandleEvent(TEvent eventData);
}
实现事件总线
事件总线
主要定义三个方法,注册、取消注册、事件触发。提供统一的事件注册、取消注册和触发接口EventBus
要接管所有事件的发布和订阅,那它则需要有一个容器来记录事件源和事件处理。那又如何触发呢?有了事件源,我们就自然能找到绑定的事件处理逻辑,通过反射触发,事件总线利用反射完成事件源与事件处理的初始化绑定。事件总线
采用单例设计模式,确保了事件中心的唯一入口。事件总线
维护一个事件源与事件处理的映射字典_eventAndHandlerMapping
。
1 | /// <summary> |