在Java的事件监听器设计中,许多接口有多个抽象方法。例如,MouseListener 接口有 5 个方法,KeyListener 接口有 3 个方法。如果我们只关心其中的一个方法(例如,鼠标点击事件),实现完整的接口就显得过于冗长和繁琐。为了避免实现那些我们不需要的方法,适配器模式应运而生。
适配器模式提供了一个抽象的适配器类,允许我们只重写我们感兴趣的方法,而不必实现接口的所有方法。Java通过 适配器类 提供了这一功能,比如 MouseAdapter、KeyAdapter 和 WindowAdapter 等,它们为每个接口提供了默认的空实现,允许我们根据需要只覆盖感兴趣的方法。
MouseListener 接口的适配器:MouseAdapterMouseListener 接口定义了 5 个方法:
mouseClicked(MouseEvent e)mousePressed(MouseEvent e)mouseReleased(MouseEvent e)mouseEntered(MouseEvent e)mouseExited(MouseEvent e)但假如只关心 mouseClicked 方法,使用适配器模式就显得非常方便。
import java.awt.*;
import java.awt.event.*;
public class MouseAdapterExample {
public static void main(String[] args) {
// 创建窗口
Frame frame = new Frame("MouseAdapter Example");
// 创建一个按钮
Button button = new Button("Click Me");
// 使用 MouseAdapter 适配器,只关心 mouseClicked 方法
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Button clicked!");
}
});
// 设置按钮的位置和大小
button.setBounds(100, 100, 100, 50);
frame.add(button);
// 设置窗口属性
frame.setSize(300, 200);
frame.setLayout(null);
frame.setVisible(true);
}
}MouseListener 接口定义了 5 个方法,但我们只关心 mouseClicked 方法。MouseAdapter(它是 MouseListener 的一个适配器类),我们只需要重写我们感兴趣的 mouseClicked 方法,其他方法会有默认的空实现。KeyListener 接口的适配器:KeyAdapter类似于 MouseListener,KeyListener 接口也有 3 个方法:
keyPressed(KeyEvent e)
keyReleased(KeyEvent e)
keyTyped(KeyEvent e)
如果只关心 keyPressed 事件,可以使用 KeyAdapter 适配器。
import java.awt.*;
import java.awt.event.*;
public class test {
public static void main(String[] args) {
// 创建窗口
Frame frame = new Frame("KeyAdapter Example");
// 创建一个文本框
TextField textField = new TextField();
textField.setBounds(50, 100, 200, 30);
// 使用 KeyAdapter 适配器,只关心 keyPressed 方法
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Key pressed: " + e.getKeyChar());
}
});
// 将文本框添加到窗口
frame.add(textField);
// 设置窗口属性
frame.setSize(300, 200);
frame.setLayout(null);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}KeyListener 接口定义了 3 个方法,但我们只关心 keyPressed 方法。KeyAdapter,我们只需要实现 keyPressed 方法,其他两个方法(keyReleased 和 keyTyped)可以保持空实现。在AWT和Swing的事件模型中,适配器模式与观察者模式相结合。事件监听器实现了 观察者模式,而适配器模式则使得事件监听器的使用变得更加灵活和简洁。
MouseAdapter、KeyAdapter、WindowAdapter)是非常常见的应用,它们帮助我们简化事件处理的代码,特别是当我们只关心事件接口的部分方法时。