Listener与Adapter比较区别

来源:互联网 发布:开淘宝店的银行卡 编辑:程序博客网 时间:2024/05/20 20:17

监听器和适配器是Java图形用户界面(GUI,Graphics Userinterface)设计的抽象窗口工具集(AWT,Abstract WindowToolkit)的两个重要概念,他们都在java.awt包中。JDK1.1引入了委托事件模型,监听器和适配器就是这一模型的具体实现,所以理解他们就变得非常重要,初学者可能对于这两个概念有点陌生,为了节省他们看长编大论再自己总结的时间,我在这里就把自己的理解写出来,抛砖引玉。

1.委托事件模型
   要理解监听器和适配器,那么一定要了解委托事件模型,它区别于层次事件模型(JDK1.1以前的Java标准),根据不同的用户操作,产生不同的事件(Event类),并为每个事件类定义了事件对象的接受和处理方法,这些方法都包括在我们的监听器(ListenerInterfance)里面,我们注册相应的事件监听程序后,就可以接受事件对象,实现相应的方法。

什么是委托事件模型
在教材上的图中,我们可以发现,用户通过键盘、鼠标等进行操纵的行为,最终都传递给了JVM,那么JVM在接收到这些事件以后该如何处理呢?我们把这种处理事件的方案,称之为事件模型。

Java中采用的是委托事件模型:jdk1.1以后,引入的一种新的事件代理模块,通过它,事件源发出的事件被委托给(注册了的)事件监听器(Listener),并由它负责执行相应的响应方法。比如:病人生病请医生。



2.监听器和适配器是什么?
    如果一个类里声明了抽象方法,那么它也必须声明为抽象的。换句话说,包含有抽象方法的类就是抽象类。
   如果一个类里面的方法都是抽象的,那么它就是一个接口,也就是说,接口是一种特殊的抽象类。(当然,抽象类跟接口是有区别的,本文并不深入讨论这个问题)
   事件的监听程序(Listener)是接口中的一个未实现的方法。
   很明显,监听器实质上就是一个接口(Interface)。
   适配器(Adapter)是跟监听器一一对应的类。它实现了对应监听器中的所有方法,但都是空方法。注意:适配器是一个抽象类(abstractclass)

3.适配器和监听器的使用
    在实际使用中,适配器只是作为方便程序员编程的一个手段,一般情况下程序员都要重写适配器中某些需要的方法,以达到所要的功能,如果只是一个适配器,那么它什么也不干。
    当然你也完全可以不用适配器,自己把监听器里面的方法全写一遍,那么在功能上是没什么不同的。也就是说有两种完成的方式:
①需要注册监听程序的类实现接口(监听器),然后重写接口中的所有方法
②需要注册监听程序的类实现接口(监听器),然后继承适配器,再重写需要的方法

4.需要注意的地方
  Ⅰ 有些教材把事件监听程序(Listener)等同于监听器(ListenerInterface),本人觉得它们应该是接口中的方法与接口的关系,另外也有人把监听器称为监听者。
    Ⅱ监听器是接口,是需要实现(implements)的,适配器是抽象类,是需要继承(extends)的。而由于适配器已经实现了对应的监听器,故继承了适配器的类不用再声明实现对应的监听器,就可以注册对应的监听程序。
例如:public class Calc1 extends WindowAdapter implementsActionListener,ItemListener
     {
          Frame f;
          TextField tf1;
          Checkbox cb1;
           ……
           public void display()
           {
             ……
           tf1.addActionListener(this);//实现了ActionListener,故可以注册对应的ActionListener
           cb1.addItemListener(this);//实现了ItemListener,故可以注册对应ItemListener
           f.addWindowListener(this);   //继承了WindowAdapter,也可以注册对应的WindowListener
                 ……
            }

         ……
       

    Ⅲ在实际使用中,由于Java只能单继承,对于接口和抽象类的选择就需慎重考虑,同样的一个类只能继承一个适配器,这也意味着其它的监听程序就需要手动实现,在优秀的编辑工具下这个工作量也许并不大,但也可以尝试把监听器交给别的类(比如类A)来实现,而类A就可以继承对应的适配器,这才是Java的单继承多接口机制的思想所在。


0 0