抽象类在适配器模式中用作target接口的默认实现基类,避免子类强制实现所有方法;它为接口每个方法提供空实现,使具体适配器可按需重写少数关心的方法,提升简洁性与可维护性,典型如awt中的mouseadapter。

抽象类在适配器模式中常作为适配器的基类,它实现 Target 接口但将所有方法留空或提供默认空实现,子类只需重写关心的方法即可。这种方式避免了强制实现接口中所有方法,特别适合接口方法较多、而具体适配器只关注其中少数方法的场景。
为什么用抽象类实现 Target 接口?
当 Target 接口定义了多个方法(如 AWT 中的 MouseListener 有 5 个方法),但实际适配器往往只关心其中一两个(比如只处理点击事件),直接实现接口会导致大量无意义的空方法体。抽象类可集中提供默认空实现,提升代码简洁性和可维护性。
典型结构:抽象适配器类
定义一个抽象类,implements Target 接口,并为每个方法提供空实现(或默认逻辑):
public interface Target {
void operationA();
void operationB();
void operationC();
}
<p>public abstract class TargetAdapter implements Target {
public void operationA() {} // 默认不做事
public void operationB() {}
public void operationC() {}
}</p>这样,具体适配器只需继承该抽象类,并重写需要的行为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public class ConcreteAdapter extends TargetAdapter {
@Override
public void operationA() {
System.out.println("实际处理 A");
}
}
结合被适配者(Adaptee)完成完整适配
抽象适配器本身不持有 Adaptee,但具体子类可以引入并委托调用:
- 在具体适配器构造时传入
Adaptee实例 - 在重写方法中调用
adaptee.someMethod()完成转换 - 保持
Target接口契约,对外暴露统一行为
public class Adaptee {
public void doSomething() { /* ... */ }
}
<p>public class SmartAdapter extends TargetAdapter {
private final Adaptee adaptee;</p><pre class="brush:java;toolbar:false;">public SmartAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void operationA() {
adaptee.doSomething(); // 委托给被适配者
}}
Java 标准库中的真实例子
Java AWT 和 Swing 大量使用该模式:
-
java.awt.event.MouseAdapter是MouseListener的抽象适配器 -
javax.swing.event.MouseInputAdapter同时适配鼠标和输入事件 - 开发者继承它们,只重写
mouseClicked等关心的方法,无需实现全部回调
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










