适配器模式怎么适配?

适配器模式怎么适配?
最新回答
语物忉灼秋

2023-12-02 23:09:42

适配器模式通过创建一个中间层(适配器)来转换不同接口或数据格式,使原本不兼容的系统或组件能够无缝协作。其核心思想是在不修改原有代码的前提下实现功能对接,具体适配方式如下:

一、适配器模式的核心原理
  1. 角色定义

    目标接口(Target):需要适配的接口或数据格式(如前台要求的List<UserProductInfoRsp>)。

    被适配者(Adaptee):现有不兼容的接口或数据格式(如数据库返回的List<UserProductInfo>)。

    适配器(Adapter):实现目标接口,并在内部调用被适配者的逻辑,完成数据转换。

  2. 转换逻辑适配器通过封装差异,将一种输入转换为另一种输出。例如:

    硬件场景:耳机转接头将圆孔插头转换为Type-C接口。

    代码场景:将数组转换为List集合(如Arrays.asList())。

耳机转接头通过物理结构转换实现接口兼容二、适配器模式的实现步骤
  1. 识别不兼容的接口确定需要对接的两个系统或组件的输入/输出格式差异。例如:

    数据库返回的数据格式与前台要求不一致。

    三方系统的接口规范与本地系统不匹配。

  2. 定义目标接口根据需求设计目标接口或数据结构。例如:

    // 前台要求的数据格式class UserProductInfoRsp { private String productName; private Date purchaseDate; // getters & setters}
  3. 实现适配器类在适配器中完成数据转换逻辑:

    public class UserProductAdapter { public List<UserProductInfoRsp> convert(List<UserProductInfo> sourceList) { List<UserProductInfoRsp> targetList = new ArrayList<>(); for (UserProductInfo source : sourceList) { UserProductInfoRsp target = new UserProductInfoRsp(); target.setProductName(source.getProductName()); target.setPurchaseDate(source.getPurchaseTime()); targetList.add(target); } return targetList; }}
  4. 调用适配器完成转换

    List<UserProductInfo> dbData = queryDatabase(); // 查询数据库UserProductAdapter adapter = new UserProductAdapter();List<UserProductInfoRsp> frontData = adapter.convert(dbData); // 转换数据

适配器在数据库查询结果与前台需求之间建立桥梁三、适配器模式的典型应用场景
  1. 系统对接

    对接三方支付接口时,将本地订单数据转换为支付宝/微信要求的格式。

    旧系统迁移时,通过适配器兼容新旧数据结构。

  2. 代码复用

    将遗留代码的接口封装为现代框架支持的格式(如将JDBC操作适配为MyBatis接口)。

    统一不同库的API调用方式(如将ArrayList适配为LinkedList的接口)。

  3. 数据格式转换

    XML与JSON互转。

    日期、货币等格式的本地化处理。

四、适配器模式的优缺点
  • 优点

    解耦:修改适配器不影响原有系统逻辑。

    复用性:同一适配器可被多个模块调用。

    扩展性:新增适配类型无需改动核心代码。

  • 缺点

    复杂度增加:过多适配器可能导致系统臃肿。

    性能损耗:中间转换层可能带来额外开销。

五、关键识别方法

当一个方法的入参是一个对象,返回值是另一个对象时,该方法可能使用了适配器模式。例如:

  • Arrays.asList():数组 → List。
  • InputStreamReader:字节流 → 字符流。
Arrays.asList()通过方法签名体现适配器特征总结

适配器模式通过中间转换层解决接口不兼容问题,其本质是对差异的封装。在实际开发中,应优先通过重构统一接口规范,仅在无法修改源码或成本过高时使用适配器模式。合理应用可显著提升系统的灵活性和可维护性。