最近有在接触关于java监听器的内容,整合了一些资料,整理如下。
首先,什么是监听器?
直观的说,监听器,即使java中的一种interface的实现。能对某个动作进行反应,比如你按下一个按钮、滑动一个页面、选择一个复选框等。
以上这些动作都产生一个事件,那么,对当前对象进行监听的监听器就会被通知某对象执行了一个动作。
下面举个例子:
比如你奶奶正在烤面包。你不知道面包何时出炉,所以你每两分钟就给你奶奶打个电话确认一下,因为你很饿,想一出炉就吃上美味的面包。可能你手头还有其他的事情要做。那么每两分钟就打个电话无疑很浪费你的时间和精力。这么看,这并非是一种好的策略。更好的办法是,你给你奶奶一个指示(实现一个监听器),让她面包一出炉就给你打个电话。很明显,烤面包的奶奶当然能知道自己面包什么时候能够出炉。她只要在面包出炉的时候给你一个电话就OK了,都不浪费任何人的时间和精力花在面包是否出炉这件事上。
那么,下面我们来用代码实现:
接口:GrannyListener
public interface GrannyListener {
public void prepareToCook(CookieEvent e);//准备
public void cooking(); // 烤面包中
public void cookiesBaked(CookieEvent e); // 烤完
}
这是一个具体实现该接口的监听类:MyGrannyListener
public class MyGrannyListener implements GrannyListener{
@Override
public void prepareToCook(CookieEvent e) {
// TODO Auto-generated method stub
System.out.println("Granny is prepared to cook at "+ e.getDate());
}
@Override
public void cooking() {
// TODO Auto-generated method stub
System.out.println("Granny is cooking ...");
}
@Override
public void cookiesBaked(CookieEvent e) {
// TODO Auto-generated method stub
int amount = e.getAmount();
System.out.println("Granny said that she produced " + amount
+ " " + (amount > 1 ? "cookies" : "cookie") + " at "
+ e.getDate());
}
}
事件类,主要是记录时间的。CookieEvent
public class CookieEvent {
private Integer amount;
private Date date;
public CookieEvent(Integer amount){
this.date = new Date();
this.amount = amount;
}
public Integer getAmount(){
return amount;
}
public Date getDate(){
return date;
}
}
下面是实体类:Grandmother
public class Grandmother{
// GRANNY STUFF
private final int SLEEPTIME = 1000;
private final int MAX_COOKIES = 25;
private CookieEvent cookieEvent;
//LISTENER STUFF
private GrannyListener grannyListener;
public void cook(){
int cookies = (int)(Math.random()*MAX_COOKIES-1)+1;
// prepare
cookieEvent = new CookieEvent(cookies);
grannyListener.prepareToCook(cookieEvent);
// cooking
try {
grannyListener.cooking();
Thread.sleep((int)(cookies*SLEEPTIME));
} catch (InterruptedException e) { }
// done
cookieEvent = new CookieEvent(cookies);
grannyListener.cookiesBaked(cookieEvent);
}
public void addGrannyListener(GrannyListener listener){
this.grannyListener = listener;
}
}
最后,我们来写个Demo类验证一下:
public class Demo {
final static Grandmother granny = new Grandmother();
public static void main(String[] args) {
MyGrannyListener mgGrannyListenter1 = new MyGrannyListener();
granny.addGrannyListener(mgGrannyListenter1);
granny.cook();
}
}
Granny is prepared to cook at Mon May 25 21:08:44 CST 2015
Granny is cooking ...
Granny said that she produced 6 cookies at Mon May 25 21:08:50 CST 2015
下面我们来画张类图说明一下:
就如上图所画的,细心的同学其实已经发现,监听器的核心部分其实就是回调函数的使用。
http://blog.csdn.net/lin00kun11/article/details/45846907
本人写的该篇文章也对回调函数做了粗浅的介绍。
我认为要实现一个监听器,包括下面几个条件。
1.你必须得先有一个实体类,本例中,Grandmother类即是一个这样的类
2.你必须得有一个监听器的实现类,本例中,MyGrannyListener类就实现了接口GrannyListener。或许以后,当奶奶不是烤面包,而是烤红薯的时候
你还可以实现另外一个监听类来监听奶奶烤红薯的过程。
3.在Grandmother实体类中,要绑定监听器。我们在此处绑定的是接口GrannyListener,这么做的好处是,如果将来奶奶烤红薯的时候,我们不需要
改Grandmother类,只需要实现一个新的监听器,然后在实例化的时候往Grandmother中传新的监听器就可以了。
4.最后一个步骤当然是你在奶奶烤面包的方法中,要通知监听器了。监听器是死的,奶奶是活的,奶奶自己做了什么事情,做到哪一步了,要告诉监听器。
以上的几个步骤就实现了一个监听器的基本编写。
才疏学浅,有什么不足的地方,请大家指出。