java监听器

来源:互联网 发布:淘宝优惠群公告怎么写 编辑:程序博客网 时间:2024/09/21 09:28

最近有在接触关于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{@Overridepublic void prepareToCook(CookieEvent e) {// TODO Auto-generated method stubSystem.out.println("Granny is prepared to cook at "+ e.getDate());}@Overridepublic void cooking() {// TODO Auto-generated method stubSystem.out.println("Granny is cooking ...");}@Overridepublic void cookiesBaked(CookieEvent e) {// TODO Auto-generated method stubint 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 2015Granny 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.最后一个步骤当然是你在奶奶烤面包的方法中,要
通知监听器了。监听器是死的,奶奶是活的,奶奶自己做了什么事情,做到哪一步了,要告诉监听器。


以上的几个步骤就实现了一个监听器的基本编写。

才疏学浅,有什么不足的地方,请大家指出。


0 0
原创粉丝点击