23种设计模式-结构型模式之适配器模式(Java版本)

Java 适配器模式(Adapter Pattern)详解

🔌 什么是适配器模式?

适配器模式用于将一个类的接口转换成客户端所期望的另一种接口,让原本接口不兼容的类可以协同工作。

📦 就像插头转换器,让不同国家的插座和电器匹配。


🧠 使用场景

  • 系统中有现成的类,但接口不符合需求
  • 想复用老代码,但不想改动它
  • 接口适配第三方库或遗留系统

🏗️ 模式结构

  • Target(目标接口):客户端期望的接口
  • Adaptee(被适配者):已有的接口
  • Adapter(适配器):将 Adaptee 转换为 Target

✅ 示例:USB 转 Type-C 适配器

目标接口(TypeC)

java 复制代码
public interface TypeC {
    void chargeWithTypeC();
}

被适配者(老版 USB)

java 复制代码
public class USBCharger {
    public void chargeWithUSB() {
        System.out.println("使用 USB 接口充电");
    }
}

适配器类(类适配器方式,使用继承)

java 复制代码
public class USBToTypeCAdapter extends USBCharger implements TypeC {
    @Override
    public void chargeWithTypeC() {
        System.out.println("适配器转换 Type-C -> USB");
        chargeWithUSB(); // 实际还是调用 USB
    }
}

客户端调用

java 复制代码
public class Main {
    public static void main(String[] args) {
        TypeC charger = new USBToTypeCAdapter();
        charger.chargeWithTypeC();
    }
}

🔄 另一种方式:对象适配器(使用组合)

java 复制代码
public class USBToTypeCObjectAdapter implements TypeC {
    private USBCharger usbCharger;

    public USBToTypeCObjectAdapter(USBCharger usbCharger) {
        this.usbCharger = usbCharger;
    }

    @Override
    public void chargeWithTypeC() {
        System.out.println("对象适配器:Type-C -> USB");
        usbCharger.chargeWithUSB();
    }
}

🧩 优点

  • 解耦客户端与具体实现类
  • 提高复用性(复用旧类)
  • 灵活性强:支持类适配或对象适配

⚠️ 缺点

  • 增加系统复杂性
  • 过多使用会导致系统中充斥着适配器,降低可读性

✅ 使用建议

适配器模式适用于以下场景:

  • 接口不兼容但需复用旧类
  • 调整不同模块或库之间的协作接口
  • 系统升级过渡阶段,保留旧逻辑的同时支持新接口
相关推荐
爬虫程序猿1 小时前
用 Python 给京东商品详情做“全身 CT”——可量产、可扩展的爬虫实战
开发语言·爬虫·python
顾漂亮2 小时前
Token快过期的三种续期方案
java·spring·状态模式
徐同保2 小时前
tailwindcss暗色主题切换
开发语言·前端·javascript
蓝纹绿茶3 小时前
bash:**:pip:***python: 错误的解释器: 没有那个文件或目录
开发语言·python·pip
云知谷3 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
START_GAME3 小时前
深度学习Diffusers:用 DiffusionPipeline 实现图像生成
开发语言·python·深度学习
牢七4 小时前
mwf攻防。
java
不爱编程的小九九4 小时前
小九源码-springboot088-宾馆客房管理系统
java·开发语言·spring boot
Evand J4 小时前
【MATLAB例程】到达角度定位(AOA),平面环境多锚点定位(自适应基站数量),动态轨迹使用EKF滤波优化。附代码下载链接
开发语言·matlab·平面·滤波·aoa·到达角度
细节控菜鸡5 小时前
【2025最新】ArcGIS for JS 实现随着时间变化而变化的热力图
开发语言·javascript·arcgis