文章摘抄于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("鼠标单击事件");
}
}
由此可见,通过使用事件的适配器,可以让我们的代码只关注自己的事件,而不必造成不必要的代码浪费。这就是适配器模式在事件处理中的应用。