springboot源码分析(四)-监听器实现原理(上)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

springboot源码分析(四)-监听器实现原理(上)
开篇之前先把祖师爷搬出来
费⽟清:问⼤家⼀个脑筋急转弯,⼥⼈⽣孩⼦,⽤⼀个成语来形容这⼀现象
思考。

思考。

思考。

揭晓谜底:
反正谜底我已经揭晓了,⾄于⼤家能不能看到,我就不管了,哈哈
概述
监听器,在很多的源码中都⾮常的常见,之后我会写⼀个nacos源码分析的⽂章,那⾥⾯也⽤了很多的监听器,为什么要使⽤监听器,举个例⼦,⼤家在过红绿灯的时候,每⼀个司机其实就是⼀个观察者,那观察的⽬标是什么呢?观察的⽬标就是红绿灯,那这个过程中会产⽣什么事件呢?就是红灯,黄灯,绿灯的事件,当司机收到这些事件之后会做出不同的举动。

那如果不使⽤这种模式,就是我不⽤红绿灯,我直接找个交警去⼀个司机⼀个司机通知,告诉每个司机,你可以⾛了,你不能⾛,⽐较⼀下⼤家就可以发现第⼀种⽅式效率更⾼。

其实上⾯的红绿灯的场景就是⼀个典型的监听器模式,是23中设计模式中的⼀种,要想搞明⽩springboot中的监听器原理,就要先搞清楚监听器模式原理,所以本篇⽂章就先介绍设计模式之-监听器模式。

监听器模式核⼼组成部分
⽬标:这个很难解释,我就把⽐较官⽅的话贴出来吧,⼤家看完例⼦之后回头看看官⽅的定义,⽬标被观察的对象,在⽬标中定义了⼀个观察者集合,提供⼀系列⽅法可以增加或者删除观察者,同时定义了通知观察者的⽅法,⽬标类可以是接⼝或者抽象类或者具体类。

具体⽬标:是⽬标类的字类
Observer:观察者,对观察⽬标的改变做出反应,观察者⼀般定义为接⼝
ConcreteObserver:具体观察者,和具体的⽬标状态绑定
看这些概念很头⼤,下⾯看⼀个具体的例⼦
观察者
package com.example.demo.event;
/**
* @author steve
* @date 2020/6/3 3:02 下午
*/
public interface WeekendListener {
public void onEvent(WeekendEvent event);
}
具体观察者
public class SleepListener implements WeekendListener{
@Override
public void onEvent(WeekendEvent event) {
if (event instanceof SleepEvent){
System.out.println("hello,"+event.getName());
}
}
}
具体观察者
public class ShoppingListener implements WeekendListener{
@Override
public void onEvent(WeekendEvent event) {
if (event instanceof ShoppingEvent){
System.out.println("hello, "+event.getName());
}
}
}
事件
public class ShoppingEvent implements WeekendEvent{
@Override
public String getName() {
return "shopping";
}
}
事件
public class SleepEvent implements WeekendEvent{
@Override
public String getName() {
return "sleep";
}
}
⽬标
public abstract class AbstractEventtMulticaster {
public List<WeekendListener> listeners ;
public AbstractEventtMulticaster(List<WeekendListener> listeners){
this.listeners = new ArrayList<>(listeners);
}
public void multicaster(WeekendEvent event){
doStart();
listeners.stream().forEach(l -> l.onEvent(event));
doEnd();
}
public void addListener(WeekendListener listener){
listeners.add(listener);
}
public void removeListener(WeekendListener listener){
listeners.remove(listener);
}
abstract public void doStart();
abstract public void doEnd();
}
具体⽬标
public class SimpleEventMulticaster extends AbstractEventtMulticaster{ public SimpleEventMulticaster(List<WeekendListener> listeners) {
super(listeners);
}
@Override
public void doStart() {
System.out.println("start 搞事情");
}
@Override
public void doEnd() {
System.out.println("end 搞事情");
}
}
测试
public class Test {
public static void main(String[] args) {
ShoppingListener shoppingListener = new ShoppingListener();
SleepListener sleepListener = new SleepListener();
SimpleEventMulticaster simpleEventMulticaster = new SimpleEventMulticaster(new ArrayList<WeekendListener>());
simpleEventMulticaster.addListener(shoppingListener);
simpleEventMulticaster.addListener(sleepListener);
simpleEventMulticaster.multicaster(new ShoppingEvent());
simpleEventMulticaster.removeListener(shoppingListener);
simpleEventMulticaster.multicaster(new ShoppingEvent());
}
}
输出结果:
start 搞事情
hello, shopping
end 搞事情
start 搞事情
end 搞事情
解释:这⾥定义了观察者WeekendListener,这个观察者的作⽤就是观察周末到底要⼲啥,然后定义了两个具体观察者,就是ShoppingListener和SleepListener,这两个是具体观察者,观察这个⼈是睡觉还是去购物,然后就定义了两种⾏为,也就是两个事件SleepEvent和ShoppingEvent,这两个事件就是具体的状态,然后定义了⽬标就是AbstractEventtMulticaster,这个⾥⾯定义了观察者的集合,定义了新增和删除观察者,同时还定义了⼀个关键的⽅法multicaster,这个⽅法会在出现具体的事件的时候,将事件⼴播给每⼀个观察者,然后执⾏回调onEvent()⽅法,其实在具体观察者中可以定义interest()⽅法,这个⽅法的作⽤就是看这个具体的观察者是不是对这个事件感兴趣,如果感兴趣就可以执⾏具体某个⾏为。

下⼀篇⽂章我会结合springboot源码分析springboot是如何使⽤观察者模式的。

相关文档
最新文档