监听器模式的角色
1、事件源 event source
2、事件对象 event object
3、事件监听器 event listener
过程
1、创建事件源
2、向事件源
注册事件监听器
3、在事件源
的监控方法
里面创建事件对象
,所有事件监听器
获取事件对象
并调用
EventObject
事件对象持有事件源的引用
package java.util;
public class EventObject implements java.io.Serializable {
private static final long serialVersionUID = 5516075349620653480L;
/** 事件源 */
protected transient Object source;
public EventObject(Object source) {
if (source == null)
throw new IllegalArgumentException("null source");
this.source = source;
}
public Object getSource() {
return source;
}
public String toString() {
return getClass().getName() + "[source=" + source + "]";
}
}
EventListener
package java.util;
public interface EventListener {
}
例子1 监听按钮的点击事件
1、事件源 event source:
2、事件对象 event object:
3、事件监听器 event listener:
事件源 event source: Button
事件源持有监听器数组的引用
@Data
public class Button {
private String name;
private List<ButtonListener> listeners;
/** 注册监听器 */
public void registerEventListener(ButtonListener listener) {
listeners.add(listener);
}
public Button(String name) {
super();
this.name = name;
listeners = new ArrayList<>();
}
public void click() {
System.out.println("点击按钮");
// 创建事件对象
ButtonEvent e = new ButtonEvent(this);
for(ButtonListener listener: listeners) {
new Thread(()->{
listener.buttonClicked(e);
}).start();
}
}
}
事件对象 event object: ButtonEvent
事件对象持有事件源的引用
public class ButtonEvent extends EventObject {
private static final long serialVersionUID = 3185848587777112305L;
public ButtonEvent(Object source) {
super(source);
}
}
事件监听器 event listener: ButtonListener
public interface ButtonListener extends EventListener {
/** 按钮点击事件 */
public void buttonClicked(ButtonEvent e);
}
public class ButtonListenerImpl01 implements ButtonListener {
@Override
public void buttonClicked(ButtonEvent e) {
Button button = (Button)e.getSource();
System.out.println("source=" + button.getName());
System.out.println("点击按钮事件");
}
}
测试
public class ButtonDemo {
public static void main(String[] args) {
Button button = new Button("提交按钮");
button.registerEventListener(new ButtonListenerImpl01());
button.registerEventListener((e) ->{
// Button button2 = (Button)e.getSource();
System.out.println("按钮释放事件");
});
button.registerEventListener((e) ->{
System.out.println("其他事件");
});
button.click();
}
}
/**打印结果:
点击按钮
按钮释放事件
其他事件
source=提交按钮
点击按钮事件
*/
例子2 监听用户的保存和删除操作
事件源 event source: ManagerUserService
监听用户的保存和删除操作
@Data
public class ManagerUser {
public ManagerUser(String name) {
super();
this.name = name;
}
private String id;
private String name;
}
/** 用户服务类 */
public class ManagerUserService {
{
listeners = new ArrayList<>();
}
private List<ManagerUserListener> listeners;
public void registerEventListener(ManagerUserListener listener) {
listeners.add(listener);
}
/** 保存用户 */
public ManagerUser saveUser(ManagerUser user) {
_listen(ManagerUserEvent.TYPE_BEFORE_SAVE, user);
System.out.println(String.format("保存用户:%s", user));
user.setId("001");
_listen(ManagerUserEvent.TYPE_AFTER_SAVE, user);
return user;
}
/** 删除用户 */
public void deleteUser(ManagerUser user) {
_listen(ManagerUserEvent.TYPE_BEFORE_DELETE, user);
System.out.println(String.format("删除用户:%s", user));
_listen(ManagerUserEvent.TYPE_AFTER_DELETE, user);
}
private void _listen(String type, ManagerUser user) {
_action(new ManagerUserEvent(this, type, user));
}
private void _action(ManagerUserEvent e) {
if(listeners == null || listeners.isEmpty()) {
return;
}
for(ManagerUserListener listener: listeners) {
new Thread(()->{
listener.action(e);
}).start();
}
}
}
事件对象 event object: ManagerUserEvent
@Data
@EqualsAndHashCode(callSuper=false)
public class ManagerUserEvent extends EventObject {
private static final long serialVersionUID = 3185848587777112305L;
public static String TYPE_BEFORE_SAVE = "before_save";
public static String TYPE_AFTER_SAVE = "after_save";
public static String TYPE_BEFORE_DELETE = "before_delete";
public static String TYPE_AFTER_DELETE = "after_delete";
private String type;
private ManagerUser user;
public ManagerUserEvent(Object source) {
super(source);
}
public ManagerUserEvent(Object source, String type, ManagerUser user) {
super(source);
this.type = type;
this.user = user;
}
}
事件监听器 event listener: ButtonListener
public interface ManagerUserListener extends EventListener {
public void action(ManagerUserEvent e);
}
测试 ManagerUserDemo
注册了两个匿名的监听器
public class ManagerUserDemo {
public static void main(String[] args) {
ManagerUserService userService = new ManagerUserService();
userService.registerEventListener(e->{
// ManagerUserService service = (ManagerUserService)e.getSource();
ManagerUser u = e.getUser();
if(ManagerUserEvent.TYPE_BEFORE_SAVE.equals(e.getType())) {
System.out.println("监听保存前操作..." + u);
} else if(ManagerUserEvent.TYPE_AFTER_SAVE.equals(e.getType())) {
System.out.println("监听保存后操作..." + u);
}
});
userService.registerEventListener(e->{
ManagerUser u = e.getUser();
if(ManagerUserEvent.TYPE_BEFORE_DELETE.equals(e.getType())) {
System.out.println("监听删除前操作..." + u);
} else if(ManagerUserEvent.TYPE_AFTER_DELETE.equals(e.getType())) {
System.out.println("监听删除后操作..." + u);
}
});
ManagerUser user = new ManagerUser("小爱");
userService.saveUser(user);
userService.deleteUser(user);
}
}
/* 打印结果:
监听保存前操作...ManagerUser(id=null, name=小爱)
保存用户:ManagerUser(id=null, name=小爱)
监听保存后操作...ManagerUser(id=001, name=小爱)
删除用户:ManagerUser(id=001, name=小爱)
监听删除前操作...ManagerUser(id=001, name=小爱)
监听删除后操作...ManagerUser(id=001, name=小爱)
*/
例子3 springboot中的监听器模式
使用目标:
等待某个spring的Bean对象完成初始化后,在执行其他操作
总共使用4个类进行实验
EventConfig(配置类)、TestObject、MyEventObject(事件对象)、MyEventListener(事件监听器)
@Configuration
@Order(9999)
@Slf4j
public class EventConfig {
@Autowired TestObject testObject;
@PostConstruct
public void init() {
log.info("EventConfig.init...");
testObject.load();
}
}
@Component
@Slf4j
public class TestObject implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void load() {
applicationContext.publishEvent(new MyEventObject(this, MyEventObject.Step.START));
log.info("TestObject正在初始化...");
log.info("TestObject初始化完成...");
applicationContext.publishEvent(new MyEventObject(this, MyEventObject.Step.STOP));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
@Data
public class MyEventObject extends ApplicationEvent {
public enum Step {START, STOP}
MyEventObject.Step step;
public MyEventObject(TestObject source, MyEventObject.Step step) {
super(source);
this.setStep(step);
}
}
@Component
@Slf4j
public class MyEventListener implements ApplicationListener<MyEventObject> {
public void doSomething() {
log.info("等待TestObject完全初始化在执行其他任务...");
}
@Override
public void onApplicationEvent(MyEventObject event) {
if(MyEventObject.Step.START.equals(event.getStep())) {
log.info("TestListener-正在处理start事件...");
} else if(MyEventObject.Step.STOP.equals(event.getStep())) {
log.info("TestListener-正在处理stopt事件...");
doSomething();
}
}
}
springboot项目启动后打印信息:
EventConfig.init...
TestListener-正在处理start事件...
TestObject正在初始化...
TestObject初始化完成...
TestListener-正在处理stopt事件...
等待TestObject完全初始化在执行其他任务...