Java 中的适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种 结构型设计模式,用于在两个不兼容的接口之间建立桥梁,使它们可以协同工作。它通常用于让已有的类与新接口兼容,而无需修改原有代码。


1. 适配器模式的基本结构

适配器模式有三种主要形式:

  • 对象适配器(基于组合)
  • 类适配器(基于继承)
  • 接口适配器(基于抽象类)

(1) 角色组成

  1. 目标接口(Target):定义客户期望的接口。
  2. 被适配者(Adaptee):需要适配的类,通常已有不兼容的方法。
  3. 适配器(Adapter):连接 TargetAdaptee,使其兼容。

2. 适配器模式的实现

(1) 对象适配器模式(推荐,基于组合)

对象适配器使用 组合 方式,让适配器持有 Adaptee 实例,在 Adapter 中调用 Adaptee 的方法。

示例:将 220V 电压适配为 5V
// 目标接口:手机充电器希望得到 5V 电压
interface Voltage5V {
    int output5V();
}

// 被适配者:现有 220V 电压
class Voltage220V {
    public int output220V() {
        return 220;
    }
}

// 适配器:适配 220V 到 5V
class VoltageAdapter implements Voltage5V {
    private Voltage220V voltage220V; // 组合方式

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        int src = voltage220V.output220V();
        return src / 44; // 转换为 5V
    }
}

// 客户端代码
public class AdapterPatternDemo {
    public static void main(String[] args) {
        Voltage220V voltage220V = new Voltage220V();
        VoltageAdapter adapter = new VoltageAdapter(voltage220V);
        System.out.println("输出电压:" + adapter.output5V() + "V");
    }
}

优点

  • 遵循 组合优先于继承,不改变 Adaptee 的代码。
  • 可以适配多个 Adaptee,更灵活。

(2) 类适配器模式(基于继承)

类适配器使用 继承 方式,使 Adapter 继承 Adaptee 并实现 Target 接口。

示例
// 适配器:继承 Voltage220V,实现 Voltage5V
class VoltageClassAdapter extends Voltage220V implements Voltage5V {
    @Override
    public int output5V() {
        int src = output220V(); // 直接调用父类方法
        return src / 44;
    }
}

缺点

  • 由于 Java 不支持多继承,适配器无法同时适配多个 Adaptee
  • 适配器与 Adaptee 绑定,不够灵活。

(3) 接口适配器模式(缺省适配器,基于抽象类)

适用于接口中有多个方法,但客户端只需实现其中一部分的情况。

示例:自定义 MouseListener
// 原始接口
interface MouseListener {
    void onClick();
    void onDoubleClick();
    void onRightClick();
}

// 适配器:提供默认实现,子类只需实现需要的方法
abstract class MouseAdapter implements MouseListener {
    @Override public void onClick() {}
    @Override public void onDoubleClick() {}
    @Override public void onRightClick() {}
}

// 只关心单击事件的子类
class ClickListener extends MouseAdapter {
    @Override
    public void onClick() {
        System.out.println("单击事件触发");
    }
}

优点

  • 让子类只需覆盖需要的方法,避免实现所有方法。
  • 常用于 Java SwingServlet API 的监听器适配。

3. 适配器模式在 Java 框架中的应用

场景适配器作用
Spring MVCHandlerAdapter适配不同类型的 Controller
Spring AOPAdvisorAdapter适配不同类型的通知(Advice)
Java I/OInputStreamReader适配 InputStreamReader
Servlet 监听器ServletRequestListener适配不同类型的请求事件
JDBCDriverAdapter适配不同数据库驱动

4. 适配器模式 vs 其他模式

模式目的
适配器模式让已有类兼容新接口,解决接口不兼容问题
装饰器模式在不改变原类的基础上增强功能
桥接模式让抽象部分和实现部分分离,支持扩展

5. 适配器模式的优缺点

✅ 优点

  • 解耦:让原本不兼容的类可以协同工作,而不修改原有代码。
  • 复用:可以复用 Adaptee,减少重复代码。
  • 扩展性强:对象适配器模式可以适配多个 Adaptee,不受继承限制。

❌ 缺点

  • 可能增加系统复杂度:引入额外的适配器层,增加类的数量。
  • 类适配器受限:由于 Java 不支持多继承,类适配器不能适配多个 Adaptee

6. 总结

  • 对象适配器(推荐):使用 组合 方式,灵活性高,适用于大多数情况。
  • 类适配器(局限性):使用 继承,不能适配多个 Adaptee
  • 接口适配器(缺省适配):适用于接口方法多,但只需要部分实现的情况。

Java 适配器模式的典型应用包括 Spring MVC HandlerAdapterJava I/O InputStreamReaderAOP AdvisorAdapter 等,是一种非常常见的设计模式。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值