2023-12-02 23:09:42
适配器模式通过创建一个中间层(适配器)来转换不同接口或数据格式,使原本不兼容的系统或组件能够无缝协作。其核心思想是在不修改原有代码的前提下实现功能对接,具体适配方式如下:
一、适配器模式的核心原理角色定义
目标接口(Target):需要适配的接口或数据格式(如前台要求的List<UserProductInfoRsp>)。
被适配者(Adaptee):现有不兼容的接口或数据格式(如数据库返回的List<UserProductInfo>)。
适配器(Adapter):实现目标接口,并在内部调用被适配者的逻辑,完成数据转换。
转换逻辑适配器通过封装差异,将一种输入转换为另一种输出。例如:
硬件场景:耳机转接头将圆孔插头转换为Type-C接口。
代码场景:将数组转换为List集合(如Arrays.asList())。

识别不兼容的接口确定需要对接的两个系统或组件的输入/输出格式差异。例如:
数据库返回的数据格式与前台要求不一致。
三方系统的接口规范与本地系统不匹配。
定义目标接口根据需求设计目标接口或数据结构。例如:
// 前台要求的数据格式class UserProductInfoRsp { private String productName; private Date purchaseDate; // getters & setters}实现适配器类在适配器中完成数据转换逻辑:
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; }}调用适配器完成转换
List<UserProductInfo> dbData = queryDatabase(); // 查询数据库UserProductAdapter adapter = new UserProductAdapter();List<UserProductInfoRsp> frontData = adapter.convert(dbData); // 转换数据
系统对接
对接三方支付接口时,将本地订单数据转换为支付宝/微信要求的格式。
旧系统迁移时,通过适配器兼容新旧数据结构。
代码复用
将遗留代码的接口封装为现代框架支持的格式(如将JDBC操作适配为MyBatis接口)。
统一不同库的API调用方式(如将ArrayList适配为LinkedList的接口)。
数据格式转换
XML与JSON互转。
日期、货币等格式的本地化处理。
优点
解耦:修改适配器不影响原有系统逻辑。
复用性:同一适配器可被多个模块调用。
扩展性:新增适配类型无需改动核心代码。
缺点
复杂度增加:过多适配器可能导致系统臃肿。
性能损耗:中间转换层可能带来额外开销。
当一个方法的入参是一个对象,返回值是另一个对象时,该方法可能使用了适配器模式。例如:
适配器模式通过中间转换层解决接口不兼容问题,其本质是对差异的封装。在实际开发中,应优先通过重构统一接口规范,仅在无法修改源码或成本过高时使用适配器模式。合理应用可显著提升系统的灵活性和可维护性。