首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >23种设计模式之适配器模式

23种设计模式之适配器模式

作者头像
紫风
发布2025-10-14 15:22:46
发布2025-10-14 15:22:46
2390
举报

以下是 适配器模式 (Adapter Pattern) 的详细介绍,包含定义、优缺点、应用场景及代码实现:


一、适配器模式概述
  • 英文名称:Adapter
  • 核心目标将一个类的接口转换成客户端期望的另一个接口,解决接口不兼容问题。
  • 设计思想:通过包装不兼容的类,使其能够与其他类协同工作,类似现实中的电源转接头。

二、优缺点
优点
  1. 接口兼容:使原本不兼容的类可以协同工作。
  2. 复用性高:复用现有类,无需修改其源代码。
  3. 灵活性:适配器可动态切换,支持多个适配者。
缺点
  1. 过度使用复杂:过多适配器会增加代码结构复杂度。
  2. 性能损耗:多层包装可能增加调用链长度(微乎其微)。

三、应用场景
  1. 整合第三方库:将第三方接口转换为系统内部标准接口。
  2. 旧系统迁移:在不修改旧代码的情况下与新系统对接。
  3. 统一接口规范:如将不同格式的数据(XML/JSON)转换为统一格式。
  4. 兼容性封装:例如 JDBC 驱动适配不同数据库的 SQL 差异。

四、代码实现与注释

以下通过 电源适配器 的案例演示适配器模式,包含类适配器和对象适配器两种实现:


1. 目标接口(客户端期望的电压)
代码语言:javascript
复制
/**
 * 目标接口:客户端期望的 5V 电压
 */
public interface FiveVolt {
    int output5V();
}

2. 适配者(现有 220V 电源)
代码语言:javascript
复制
/**
 * 适配者:现有的 220V 电源(需被适配的类)
 */
public class AC220V {
    public int output220V() {
        System.out.println("输出 220V 交流电");
        return 220;
    }
}

3. 对象适配器(组合方式实现)
代码语言:javascript
复制
/**
 * 对象适配器:将 220V 转换为 5V(通过组合适配者)
 */
public class PowerAdapter implements FiveVolt {
    private final AC220V ac220V;  // 持有适配者对象

    public PowerAdapter(AC220V ac220V) {
        this.ac220V = ac220V;
    }

    @Override
    public int output5V() {
        int input = ac220V.output220V();
        int output = input / 44;  // 模拟电压转换
        System.out.println("适配器将 " + input + "V 转换为 " + output + "V");
        return output;
    }
}

4. 类适配器(继承方式实现,需适配者为类)
代码语言:javascript
复制
/**
 * 类适配器:通过继承适配者类实现(Java 单继承限制,需适配者为类)
 */
public class PowerClassAdapter extends AC220V implements FiveVolt {
    @Override
    public int output5V() {
        int input = super.output220V();  // 直接调用父类方法
        int output = input / 44;
        System.out.println("类适配器输出:" + output + "V");
        return output;
    }
}

5. 客户端调用
代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        // 对象适配器调用
        AC220V ac220V = new AC220V();
        FiveVolt adapter = new PowerAdapter(ac220V);
        int volt = adapter.output5V();
        System.out.println("客户端获得电压:" + volt + "V\n");

        // 类适配器调用
        FiveVolt classAdapter = new PowerClassAdapter();
        volt = classAdapter.output5V();
        System.out.println("客户端获得电压:" + volt + "V");
    }
}

6. 输出结果
代码语言:javascript
复制
输出 220V 交流电
适配器将 220V 转换为 5V
客户端获得电压:5V

输出 220V 交流电
类适配器输出:5V
客户端获得电压:5V

五、模式结构图
代码语言:javascript
复制
+----------------+          +----------------+
|   Target       | <------+ |   Adaptee      |
+----------------+          +----------------+
| output5V()     |          | output220V()   |
+----------------+          +----------------+
       ^                              ^
       |                              |
+----------------+          +----------------+
|   Adapter      |          |                |
+----------------+          +----------------+
| - adaptee:Adaptee         |                |
| output5V()     |          |                |
+----------------+          +----------------+

六、与其他模式的关系
  1. 装饰器模式:适配器改变接口,装饰器增强功能。
  2. 代理模式:适配器侧重接口转换,代理控制访问。
  3. 外观模式:适配器解决单个接口兼容,外观模式简化子系统接口。

七、最佳实践
  1. 优先对象适配器:避免 Java 单继承限制,更灵活。
  2. 接口适配器:定义抽象类实现目标接口空方法,子类按需重写(如 WindowAdapter)。
  3. 结合工厂模式:通过工厂创建适配器,隐藏实现细节。

八、总结
  • 核心价值:解决接口不兼容问题,实现代码复用和解耦。
  • 适用场景:整合遗留系统、第三方库或统一多源接口。
  • 关键实现:目标接口 + 适配者类 + 适配器类(组合或继承)。

Java 中 Arrays.asList() 将数组适配为 List,Spring 的 HandlerInterceptorAdapter 简化拦截器实现,均是适配器模式的典型应用。掌握该模式可提升系统兼容性和扩展性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、适配器模式概述
  • 二、优缺点
    • 优点:
    • 缺点:
  • 三、应用场景
  • 四、代码实现与注释
    • 1. 目标接口(客户端期望的电压)
    • 2. 适配者(现有 220V 电源)
    • 3. 对象适配器(组合方式实现)
    • 4. 类适配器(继承方式实现,需适配者为类)
    • 5. 客户端调用
    • 6. 输出结果
  • 五、模式结构图
  • 六、与其他模式的关系
  • 七、最佳实践
  • 八、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档