事件系统的设计与实现

事件系统主要用于模块间的解耦,通过集中管理事件的发生和处理,将原本的n-n依赖变为n-1的依赖。它作为一个中介,使得触发者和监听者只需关注事件本身,而不直接依赖彼此。当模块需要依赖另一模块的状态或时机时,可以使用事件系统。设计事件系统应考虑其全局唯一性、独立性及分发映射功能,通常采用观察者模式实现。使用事件系统涉及两个主要接口:绑定监听事件和触发事件。
摘要由CSDN通过智能技术生成

引述

本文会讲述以下几个内容:

  1. 事件系统有什么用
  2. 什么情况下会使用事件
  3. 如何去设计一个事件系统
  4. 如何使用一个事件系统

事件系统有什么用

事件系统的好处有很多,其中最主要的是用于模块之间的解耦,以及各个内容之间的解耦。

在开发过程中一定会存在一个模块需要依赖另一个模块的一些数据和状态,从而执行自身逻辑的情况。

在这种情况下,依赖其他模块的一些状态和数据,那么正常的做法就是引用对方模块,从而拿到对应的数据和状态,然后执行对应的操作。如果另一个模块没有这些数据那么我们这个模块是不是就无法运行了。

事件系统可以让模块之间的依赖简化为对事件系统的依赖,那么模块之间的依赖就从原本的n-n变成了,n-1的依赖。

事件系统是什么?怎么解耦?

那么事件系统是如何达到解耦的效果的?

事件系统就相当于是一个管理中心,负责管理各种事件的发生,以及发生之后要做什么。

事件系统相当于是在各个模块事件依赖链接中的一个中介,桥梁。事件的触发者经过事件系统分发到各个模块,事件的接收者通过事件系统监听各个模块发出的事件。因此各个模块需要关心的只有事件系统,而非各个模块。

一开始各个模块之间是相互依赖,有的模块即使事件的触发者就是事件的接收者,就会导致模块之间依赖混乱,例如:

使用事件系统之后,各个模块之间的依赖关系是这样的:
在这里插入图片描述

从上图可以发现,不管是事件的触发者,还是事件的监听者,都从原本的需要跟多个模块进行依赖,到只需要依赖事件系统即可。

事件的触发者将事件发送给事件系统,事件系统再将事件的发生转发给各个监听者。事件的触发者不需要关注谁监听了该事件,而事件的监听者也不需要关注谁触发的该事件,双方都只需要关注自己的业务即可。

什么时候会使用事件系统?

当一个模块需要依赖另一个模块的一个状态或者时机的时候,就可以使用事件系统。

场景就是:当 … 发生时就 …

使用的方式就是,当 … 发生时就告诉事件系统,事件系统知道之后就执行 …

如何设计事件系统?

一个事件系统应该具有以下的特点

  1. 事件系统应该只有一个。(因为事件系统的目的就是集中管理,让各个模块只依赖一个事件系统,因此事件系统应该是全局唯一的,使用单例模式)
  2. 事件系统应该是独立的不依赖与业务模块(由于不管是事件的监听者还是触发者都会依赖于事件系统,因此事件系统应该是独立于具体业务的,不依赖于具体业务模块)
  3. 事件的触发和监听应该是一对多的
  4. 事件系统应该具有分发和映射功能,对应的事件触发,能够映射到对应的监听者列表,并且将这个事件分发给各个监听者。

因此事件的和对应的监听的关系应该是这样的:

在这里插入图片描述

通过上面的梳理,可以发现事件系统使用的就是观察者模式进行设计的。使用者中设计模式,可以让触发者和监听者之间相互解耦。

如何使用一个事件系统?

一个事件系统正常回头两个接口:

  1. 监听绑定事件的接口 bindEvent(Event,callBack)
  2. 触发事件的接口 fire(Event)

监听绑定的接口是给监听者(观察者)进行调用的,通过调用这个接口可以监听指定的事件,当事件触发的时候通过指定的callBack 回调通知自己。

触发事件的接口是给事件的触发者进行调用的,当事件触发的时候需要主动的调用通知事件系统,进行分发。

因此使用事件系统只需要两个步骤:

  1. 被依赖的模块上调用fire 触发事件
  2. 依赖的模块上使用bindEvnet 绑定对应的事件,指定对应的回调

剩下的交给事件系统即可。事件系统会在被依赖模块执行fire的时候,执行依赖模块bind的回调内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值