文章摘抄于http://book.51cto.com/art/200912/166991.htm
第一层是EventListener顶层事件接口类,它只是定义了一个接口,没有包含任何接口函数。
第二层是AWT的事件监听器接口(以Listener为结尾),每一个监听器接口对应一种窗口事件,其中定义了多个事件处理函数。
第三层是AWT的事件适配器抽象类(以Adapter为结尾),它们分别为对应的监听器接口提供了默认的函数实现。
目的,这一特性特别适合于Java AWT中的事件处理模式。对于定义的事件监听器接口,它可能包含多个事件处理函数,但在使用时我们往往只需要关注其中的某一种事件,此时就可以使用抽象化适配来将事件监听器接口进行抽象化,给出每一个接口函数的默认实现,这样在需要使用时只需要重写自己需要的函数即可
package java.awt.event; import java.util.EventListener; public interface MouseListener extends EventListener { /** * 鼠标单击事件 */ public void mouseClicked(MouseEvent e); /** * 鼠标按下事件 */ public void mousePressed(MouseEvent e); /** * 鼠标释放事件 */ public void mouseReleased(MouseEvent e); /** * 鼠标进入事件 */ public void mouseEntered(MouseEvent e); /** * 鼠标退出事件 */ public void mouseExited(MouseEvent e); }
当我们要使用该接口编写鼠标事件处理代码时,就需要实现该接口,并实现5个事件函数
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MyMouseListener implements MouseListener { @Override public void mouseClicked(MouseEvent arg0) { System.out.println("鼠标单击事件"); } @Override public void mousePressed(MouseEvent arg0) { System.out.println("鼠标按下事件"); } @Override public void mouseReleased(MouseEvent arg0) { System.out.println("鼠标释放事件"); } @Override public void mouseEntered(MouseEvent arg0) { System.out.println("鼠标进入事件"); } @Override public void mouseExited(MouseEvent arg0) { System.out.println("鼠标退出事件"); } }
然而,我们可能只需要处理其中的某一个事件,却不得不编写所有的接口函数,此时就可以使用适配器类MouseAdapter了。该适配器实现了3个鼠标相关的事件接口,并为这些接口中的所有函数都提供了默认的实现,这些实现的代码为空,表示什么也不做
package java.awt.event; public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener { public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseWheelMoved(MouseWheelEvent e) { } public void mouseDragged(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } }
此时如果我们只希望处理鼠标单击事件,只需要继承适配器MouseAdapter,并重写单击事件函数mouseClicked()即可
import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; public class MyMouseClickedListener extends MouseAdapter { @Override public void mouseClicked(MouseEvent arg0) { System.out.println("鼠标单击事件"); } }
由此可见,通过使用事件的适配器,可以让我们的代码只关注自己的事件,而不必造成不必要的代码浪费。这就是适配器模式在事件处理中的应用。