java监听器

最近有在接触关于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.最后一个步骤当然是你在奶奶烤面包的方法中,要
通知监听器了。监听器是死的,奶奶是活的,奶奶自己做了什么事情,做到哪一步了,要告诉监听器。


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

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值