提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
监听器模式简述
前言
监听器模式三要素——事件源,事件对象,监听器
事件源:事件发生的源头,比如按钮,属于被监听的事件触发源;
事件对象:这个经常和事件源混淆,它是事件源触发的一个动作,比如点击事件,按钮点击后触发的一个事件;
监听器:这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。
下面简单举个例子说明
故事背景:小雨走在路上,失控的汽车撞向小雨,小雨拥有蜘蛛感应弱化版,身手敏捷的他直接闪开了。
先定义一个监听器,走流程,先来个接口
public interface Listener extends EventListener {
void actionInvoke(Event event);
}
监听到事件后,触发一个闪身的动作
public class TargetListener implements Listener{
@Override
public void actionInvoke(Event event) {
if(event instanceof HitEvent){
HitEvent hitEvent = (HitEvent) event;
System.out.println(hitEvent.getCarHit());
System.out.println("作为敏捷满级选手,我闪~~~");
}
}
}
定义一个事件,用于被继承
public class Event extends EventObject {
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public Event(Object source) {
super(source);
}
}
定义单个汽车撞击的事件,写入触发事件的事件源
public class HitEvent extends Event{
private String carHit;
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public HitEvent(Object source,String eventName) {
super(source);
this.carHit = eventName;
}
public String getCarHit() {
return carHit;
}
public void setCarHit(String carHit) {
this.carHit = carHit;
}
}
定义事件源,事件源需要添加监听器,并且有相应的触发事件的方法
public class People {
private String name;
private List<Listener> listenerList = new ArrayList<>();
public People(String name) {
this.name = name;
}
public void addListeners(Listener listener){
listenerList.add(listener);
}
//事件源触发事件的动作
public void walk(){
//添加点文字,显示下动作
System.out.println("小雨在路上走着");
for (Listener listener : listenerList) {
if(listener instanceof TargetListener){
TargetListener targetListener = (TargetListener) listener;
//监听器监听事件,失控的汽车撞向行人这个时间发生时,触发
targetListener.actionInvoke(new HitEvent(this, "失控的汽车撞向行人"));
}
}
}
}
写个测试类
public class Test {
public static void main(String[] args) {
People people = new People("小雨");
people.addListeners(new TargetListener());
people.walk();
}
}
测试结果如下
总结
如果觉得内容尚可,请给个赞,如果内容有问题,请在评论简要指出,共同进步,蟹蟹^^