在 Java 中参与事件驱动有三种角色:
- event object(事件对象):事件状态对象,用于 listener 的相应方法中
- event source(事件源):事件的产生者
- event listener(监听者):事件监听器,当某个具体的事件发生时,监听它的监听器就会得到通知
JDK 对事件驱动的支持:
interface EventListener
所有事件监听器需要实现此接口
class EventObject
事件对象的超类
其实,事件驱动机制本质上可以看作是观察者模式,唯一的区别是事件驱动需要有一个发布事件的角色,而观察者模式并不需要这样的角色。listener(监听器)是观察者角色,event object 是被观察者。
Spring 对事件驱动的支持
ApplicationEvent
|---ApplicationContextEvent
|-- ContextClosedEvent
|-- ContextRefreshEvent
|-- ContextStartedEvent
|-- ContextStoppedEvent
RequestHandleEvent
示例,假设当你在某个网站注册账号了,之后网站会给你发送一条短信。在这里,注册账号是事件,对事件做出反应的是发送短信(在应用中就是业务逻辑)。代码如下:
class RegisterEvent {
private String phone;
public RegisterEvent(String phone) {
this.phone = phone;
}
// getter
}
class RegisterListener {
public void onRegisterEvent(RegisterEvent event) {
System.out.println("恭喜您注册成功!");
}
}
class RegisterManager {
private RegisterListener listener;
public void publish() {
RegisterEvent event = new RegisterEvent("1333333333");
listener.onRegisterEvent(event);
}
public void addListener(RegisterListener listener) {
this.listener = listener;
}
}
PS:在实际开发中,其实并不需要完全遵守这种形式,JDK 的 java.swing 包中 JButton 等,其实充当了所有角色,所以最重要的是理解背后的理念。
网友评论