今天看了设计模式中的适配器模式,终于明白了java在添加事件时为什么要老是用到继承xxxAdapter了。
首先说说适配器是什么东西吧,网站上到处都有,就不多说了。主要有三种适配器:1、类适配器。2、对象适配器。3、双向适配器。
下面是一个简单的对象适配器的类图
下面具体讲下适配器模式在JDK中的实例
JDK中有很多Adapter类,如WindowAdapter,MouserAdapter等,它们分别实现了WindowsListerner,MouseListener等接口,这些都是类适配器的使用实例。
MouseListener 类
package java.awt.event;
import java.util.EventListener;
public interface MouseListener extends EventListener {
/**
* Invoked when the mouse button has been clicked (pressed
* and released) on a component.
*/
public void mouseClicked(MouseEvent e);
/**
* Invoked when a mouse button has been pressed on a component.
*/
public void mousePressed(MouseEvent e);
/**
* Invoked when a mouse button has been released on a component.
*/
public void mouseReleased(MouseEvent e);
/**
* Invoked when the mouse enters a component.
*/
public void mouseEntered(MouseEvent e);
/**
* Invoked when the mouse exits a component.
*/
public void mouseExited(MouseEvent e);
}
由MouseListener类的源码可知,应用接口中充斥着大量的方法,编程者如果要实现这些接口就必须实现所有的方法,而实际中,我们往往又并不需要所有的方法,这样就会有很多的方法是空的。这样不仅是一件很麻烦的事,也影响阅读。为此,JDK通过接口Adapter类为这些接口方法提供一个默认的空方法。如下面的MouseAdapter类。
MouseAdapter类
package java.awt.event;
public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener {
/**
* {@inheritDoc}
*/
public void mouseClicked(MouseEvent e) {}
/**
* {@inheritDoc}
*/
public void mousePressed(MouseEvent e) {}
/**
* {@inheritDoc}
*/
public void mouseReleased(MouseEvent e) {}
/**
* {@inheritDoc}
*/
public void mouseEntered(MouseEvent e) {}
/**
* {@inheritDoc}
*/
public void mouseExited(MouseEvent e) {}
/**
* {@inheritDoc}
* @since 1.6
*/
public void mouseWheelMoved(MouseWheelEvent e){}
/**
* {@inheritDoc}
* @since 1.6
*/
public void mouseDragged(MouseEvent e){}
/**
* {@inheritDoc}
* @since 1.6
*/
public void mouseMoved(MouseEvent e){}
}
MouseAdapter类实现了各种鼠标监听器的接口,编程时只需要继承这个类然后实现你所需要的接口即可。代码如下:
private class KeyMonitor extends KeyAdapter{
public void keyPressed(KeyEvent e) {
myTank.keyPress(e);
}
public void keyReleased(KeyEvent e) {
myTank.keyReleased(e);
}
}
this.addWindowListener(new WindowAdapter(){
/**
* 窗口关闭事件
*/
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});