监听器,实际上是一个回调函数,具体一点就是当代码执行到某一行的时候就会调用你预先设置好的语句。
这里我们有:
监听者时刻监听着事件源,当有事件源的时候,监听者就会知道发生了什么事!相似的,警察是监听者,嫌疑犯所干的事是事件源,嫌疑犯干什么事,警察都知道。
总体涉及到:事件、事件源(也就是事件的触发者,这里指嫌疑犯)、监听器(这里指警察);
相应地,我们写几个类或者接口:Event、EventSource、Listener
1、事件
package com.huai.mylisten;
public class Event {
private Object source;
public Event(Object source){
this.source = source;
}
public Object getSource(){
return this.source;
}
}
2、监听者(需要实现类)
<span style="font-family:Microsoft YaHei;font-size:18px;">package com.huai.mylisten;
public interface Listener {
void onMyEvent(Event event);
}
</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">public class MyListener implements Listener{
@Override
public void onMyEvent(Event event) {
System.out.println(event.getSource());
}
}</span>
4、这时候,我们可以暂时写一个测试函数
<span style="font-family:Microsoft YaHei;font-size:18px;">package com.huai.mylisten;
public class TempTest {
public static void main(String[] args) {
Event event = new Event("HelloWorld");
MyListener listener = new MyListener();
listener.onMyEvent(event);
}
}</span>
可以看到,我们在main函数中实例化了事件和监听者的对象,同时在里面触发了监听的事件。但是,这个对于真正的监听器是有问题的,因为我们缺少了事件源,也就是嫌疑犯。好,下面我们就写事件源,同时让它来触发事件以及让监听者知道他正在干什么。
5、事件源
<span style="font-family:Microsoft YaHei;font-size:18px;">package com.huai.mylisten;
import java.util.ArrayList;
import java.util.List;
public class EventSource {
private List<Listener> listenerList = new ArrayList<>();
public void addListener(Listener listener){
listenerList.add(listener);
}
public void doBadThing(){
//嫌疑犯所干的事
Event event = new Event("badthing");
//让所有的监听者(警察)知道,我干了这件事
for(Listener li : listenerList){
li.onMyEvent(event);
}
}
}
</span>
从上面的事件源程序中我们可以看出,当嫌疑犯doBadThing的时候,就会有badthing这个事件产生,同时监听者就会知道。最后解释一下“监听者知道”具体指的是什么:从上面的程序中看到,我们直接调用了listener对象的onMyEvent(event)方法,所以,我们可以利用这个,在这个方法里面写我们自己实现的代码,当有doBadThing()的时候,采取相应的处理。这就是监听器。这个EventSource类可以类比一个按钮类,而doBadThing()这个函数便是点击按钮这个动作。每当点击按钮,就会new一个event事件,同时告诉监听者。
6、我们测试一些
<span style="font-family:Microsoft YaHei;font-size:18px;">package com.huai.mylisten;
public class MainTest{
public static void main(String[] args) {
EventSource eventSource = new EventSource();
eventSource.addListener(new MyListener());
eventSource.doBadThing();
}
}</span>
注意上面的addListener(listener);也就是把listener对象传进来,所以在EventSource类里面调用的listener.onMyEvent(event)的时候,实际上是调用刚刚传进的listener对象的方法。
如果还没有看懂,欢迎留言,我们一起讨论讨论!