举例场景说明;一个人一直在看电影,当电影播放到4秒的时候,这个人要去上厕所。

图1

spring boot 源码解析准备二(观察者模式)

图2

spring boot 源码解析准备二(观察者模式)

首先设置一个标记来标记是否已经到了需要上厕所的时间。如果到了把他改为true;

图3

spring boot 源码解析准备二(观察者模式)

spring boot 源码解析准备二(观察者模式)

这个人一直在看电影直到电影那边返回true他才要去上厕所。

run方法以下面的为准。

通过上面的例子我们发现,这个人一直在看电影,一直在while循环中,这样cpu消耗很大。我们能不能改成这样比如电影在播出4秒后主动通知这个人呢,这样这个人就可以做其他事情,没有必要一直在while循环中。

这个就是所谓的观察者模式。

图4

spring boot 源码解析准备二(观察者模式)

被观察者持有观察者的引用。下面是修改后的

图5

spring boot 源码解析准备二(观察者模式)

图6

spring boot 源码解析准备二(观察者模式)

spring boot 源码解析准备二(观察者模式)

改成这样但是问题又来了,如果这个电影有温情的片段,应该有落泪的动作,有搞笑的片段,应该笑等动作,而不单单只是上厕所这么一个动作。那么 我们可以把温情的片段,搞笑的片段抽取为一个事件。这个事件可以根据不同的片段场景来做不同的动作。

图7

spring boot 源码解析准备二(观察者模式)

spring boot 源码解析准备二(观察者模式) 

这个是事件类。source是事件源;为什么要有事件源呢,举例,吃饭可能对应多个事件源,人,饭,筷子,等事件源。

图8

spring boot 源码解析准备二(观察者模式)

图9

spring boot 源码解析准备二(观察者模式)

图10

spring boot 源码解析准备二(观察者模式)

执行结果。问题来了。如果不是一个人看电影,多个人看电影咋办。多个人看电影的同一个场景有可能有不同的动作。例如a 看到温情会调眼泪,b看到温情会大笑。

图11

spring boot 源码解析准备二(观察者模式)

 不可能在这个里面在传入一个b人的参数吧,如果多个人,难道要传n个参数吗, 于是就有了监听器的概念(监听器里抽象出一个公共的动作方法接口,每一个人均要实现他这个方法,来执行不同的动作),监听器是一个包含多个人的list也可以说是包含多个观察者的list, 对外提供一个add方法。当有一个人的时候,add进去一个人,多个人的时候add多个人,。在事件片段发生的时刻,依次遍历调用每一人的动作方法。

图12

spring boot 源码解析准备二(观察者模式)

监听器。

图13

spring boot 源码解析准备二(观察者模式) 

图14

spring boot 源码解析准备二(观察者模式)

图15

spring boot 源码解析准备二(观察者模式)

spring boot 源码解析准备二(观察者模式) 

图16

spring boot 源码解析准备二(观察者模式) 

spring boot 源码解析准备二(观察者模式)

 

图17

spring boot 源码解析准备二(观察者模式)

spring boot 源码解析准备二(观察者模式) 

jdk的观察者模式。

图18

spring boot 源码解析准备二(观察者模式)

被观察者。

图18-0

spring boot 源码解析准备二(观察者模式)

图18-2 

spring boot 源码解析准备二(观察者模式)

图19

spring boot 源码解析准备二(观察者模式) 

观察者

图20

spring boot 源码解析准备二(观察者模式)

观察者。 Observable为被观察者。

传说中观察者的设计模式可以取消,咋取消啊。图21

图21

spring boot 源码解析准备二(观察者模式)

spring boot 源码解析准备二(观察者模式)

结果确实不打印了。这种观察者模式的好处时解耦。

图22

spring boot 源码解析准备二(观察者模式)

任何一步出现问题,这个订单就下载失败,这个是没有办法接受的。

图23

spring boot 源码解析准备二(观察者模式)

监听模式是这样,多个监听器来监听,一旦订单生成。第一个监听器负责发红包,第二个负责发短信。如果我们这个是做活动。一旦不需要可以灵活去掉,采用从监听器中移除。这个是jdk的观察者模式,在spring中是什么样的呢,

图24

spring boot 源码解析准备二(观察者模式)

Spring中观察者模式。

图25

spring boot 源码解析准备二(观察者模式)

spring boot 源码解析准备二(观察者模式)

spring boot 源码解析准备二(观察者模式) 

 图26

spring boot 源码解析准备二(观察者模式)

对应的子事件。这几个事件的事件源都是ApplicationContext

spring boot 源码解析准备二(观察者模式)

图27

spring boot 源码解析准备二(观察者模式)

 图27-1   

spring boot 源码解析准备二(观察者模式)

 自定义事件,继承ApplicationEvent 

图27-2

spring boot 源码解析准备二(观察者模式)

自定义监听器。 

图27-3

spring boot 源码解析准备二(观察者模式)

,触发事件,赋值事件源。

图27-4

spring boot 源码解析准备二(观察者模式)

执行结果。 

图28

spring boot 源码解析准备二(观察者模式) 

spring中有个事件委派器,当event1发生事件后通过ApplicationEvenMulticater 委派给listener1. 

相关文章:

  • 2022-12-23
  • 2021-08-05
  • 2021-08-05
  • 2021-08-22
  • 2021-09-20
  • 2022-03-07
  • 2019-06-20
猜你喜欢
  • 2021-07-05
  • 2022-12-23
  • 2021-09-14
  • 2021-08-05
  • 2021-04-25
  • 2022-01-06
  • 2021-08-05
相关资源
相似解决方案