缺省适配器模式通过抽象类实现接口并提供空方法体,使子类仅需重写关心的方法,避免冗余实现;典型如MouseAdapter,兼顾语义清晰性、状态封装能力及旧JDK兼容性。

抽象类配合适配器模式,核心在于用抽象类提供接口的默认空实现,让子类只关注真正需要重写的部分,避免为不关心的方法写一堆空方法体。
为什么需要适配器模式 + 抽象类
Java 接口一旦定义,所有实现类都必须实现全部方法。但实际中,很多回调接口(比如事件监听器、UI组件回调)方法很多,使用者往往只关心其中一两个。如果直接实现接口,就得写大量 public void onXXX() { },既冗余又易出错。
抽象类作为“中间层”,可以预先为接口每个方法提供空实现(或默认逻辑),子类只需继承它并覆盖自己关心的方法即可。
典型写法:抽象适配器类
以 AWT 的 MouseAdapter 为例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
// 原始接口
interface MouseListener {
void onMousePressed(MouseEvent e);
void onMouseReleased(MouseEvent e);
void onMouseClicked(MouseEvent e);
void onMouseEntered(MouseEvent e);
void onMouseExited(MouseEvent e);
}
// 抽象适配器类 —— 实现了全部方法,但都为空
abstract class MouseAdapter implements MouseListener {
public void onMousePressed(MouseEvent e) {}
public void onMouseReleased(MouseEvent e) {}
public void onMouseClicked(MouseEvent e) {}
public void onMouseEntered(MouseEvent e) {}
public void onMouseExited(MouseEvent e) {}
}
使用时只需继承 MouseAdapter,只重写需要的方法:
class MyClickListener extends MouseAdapter {
@Override
public void onMouseClicked(MouseEvent e) {
System.out.println("只响应点击");
}
// 其他方法自动继承空实现,不用写
}
自定义适配器的实用建议
-
命名清晰:适配器类名通常以
Adapter结尾(如WindowAdapter),和原始接口名对应,便于识别 -
保持 abstract:即使所有方法都是空实现,也声明为
abstract,明确表示它不用于直接实例化 - 可加默认逻辑:某些方法可预设通用行为(如日志、空值检查),子类选择性覆盖即可
- 避免过度设计:不是每个接口都需要适配器。方法少(≤2)、职责单一的接口,直接实现更简洁
和 Java 8+ 默认方法的区别
Java 8 允许接口定义 default 方法,也能达到类似效果。但抽象适配器仍有优势:
- 支持字段和构造器(可用于传入依赖或配置)
- 可封装共享状态或辅助逻辑(如计数器、缓存)
- 语义更明确:
Adapter类名直接表达设计意图;default方法容易被忽略或误用 - 兼容老版本 JDK(若项目需支持 Java 7 及以下)

















