当我们看到下面代码的时候,我们需要清楚的知道背后发生了什么?
//object发布了一个事件object.publish(event);
object肯定内部维护了一个list,list里面存放的是一个一个监听器listener,pubish内部会遍历这个list,调用监听器的公共方法,这个方法会根据事件的类型作出相应的逻辑处理。
监听器就是希望事件的连续发生,A发布了一件事情,击鼓传花触发了B的发生。隐式发生。
关键词,链表,遍历,注册,通知
测试
比如偶像开始努力看书,那么粉丝受到影响也开始好好学习了。那如何用代码去实现这个功能呢?
我们把偶像当做事件源
看书作为事件对象
粉丝开始学习作为监听器
package com.zstu.boot.study.controller;import java.util.ArrayList;import java.util.List;public class Listener {public static void main(String[] args) {SuperStarEventSource superStarEventSource = new SuperStarEventSource("易烊千玺");FansListener fans1 = new FansListener("粉丝1");FansListener fans2 = new FansListener("粉丝2");superStarEventSource.registerFansListener(fans1);superStarEventSource.registerFansListener(fans2);superStarEventSource.notify(new EventObject("看书"));}}class SuperStarEventSource{public String eventSourceName;public SuperStarEventSource(String eventSourceName) {this.eventSourceName = eventSourceName;}public List<FansListener> fansList = new ArrayList<>();public void registerFansListener(FansListener fansListener){fansList.add(fansListener);}public void notify(EventObject event){for (FansListener fansListener : fansList) {fansListener.handleEvent(event);}}}class FansListener{public String listenerName;public FansListener(String listenerName) {this.listenerName = listenerName;}public void handleEvent(EventObject event){if(event.name.equals("看书")){System.out.println(this.listenerName + "我要学习");}else if(event.name.equals("打球")){System.out.println(this.listenerName + "我要运动");}};}class EventObject{public String name;public EventObject(String name) {this.name = name;}}
回调
我们希望在执行完A方法后,需要立刻去执行B方法,如果不用回调的方式就是顺序执行AB方法
methodA();methodB();
这样子将方法A和方法B独立开来,看不出A和B之间的联系。我们可以用回调的方式
methodA(()->methodB());
其实就是在A方法的内部调用了B。仅此而已。
