人的知识就好比一个圆圈,圆圈里面是已知的,圆圈外面是未知的。你知道得越多,圆圈也就越大,你不知道的也就越多。

0%

设计模式--监听器模式

定义

监听器模式是观察者模式的一种实现:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法。

角色

  • 事件源:提供订阅与取消监听器的方法,并负责维护监听者列表,发送事件给监听者。
  • 事件对象:事件类型,同时包装事件源。
  • 监听器:每一个监听器实现接口来接收事件,并负责从事件源订阅与取消订阅。

类图

Listener UML

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
* 事件源
*/
public class EventSource {
/**
* 事件监听类集合
*/
private List<ConcreteEventListener> eventListeners = new ArrayList<>();

/**
* 某个实际操作,会触发事件发生
*/
public void action() {
eventListeners.forEach(eventListener -> eventListener.onEvent(new ConcreteEventObject(this)));
}

/**
* 添加监听类
*
* @param eventListener 监听类
*/
public void addEventListener(ConcreteEventListener eventListener) {
this.eventListeners.add(eventListener);
}

/**
* 移除监听类
*
* @param eventListener 监听类
*/
public void removeEventListener(ConcreteEventListener eventListener) {
this.eventListeners.remove(eventListener);
}

/**
* 获取监听类集合
*/
public List<ConcreteEventListener> getEventListeners() {
return eventListeners;
}

/**
* 设置监听类集合
*/
public void setEventListeners(List<ConcreteEventListener> eventListeners) {
this.eventListeners = eventListeners;
}
}

/**
* 具体事件对象
*/
public class ConcreteEventObject extends EventObject {

/**
* 绑定事件源
*
* @param source 事件源
*/
public ConcreteEventObject(EventSource source) {
super(source);
}
}

/**
* 具体事件监听类
*/
public class ConcreteEventListener implements EventListener {

/**
* 定义事件响应动作
*
* @param event 事件对象
*/
void onEvent(ConcreteEventObject event) {
System.out.println(String.format("response event of %s", event.toString()));
}
}

模式应用

Spring Boot

在Spring Boot启动过程中,会组播一系列事件,这些事件的触发及响应就用到了监听器模式。
ApplicationEvent UML

小礼物走一走,来 Github 关注我