适配器模式通过新增“翻译层”解决新旧系统接口不兼容问题,不修改原有代码;它聚焦字段名、数据类型/单位、结构嵌套三类差异,推荐用对象适配器(组合方式)实现,配合工厂可扩展支持多源旧数据。

适配器模式是解决新旧系统对象变量接口不兼容最直接有效的方式——它不修改原有代码,只在中间加一层“翻译层”,把老对象的字段、方法、数据结构转成新系统能识别的样子。
识别不兼容点:先看清差异在哪
新旧系统接口不匹配,常见于三类变量层面的问题:
-
字段名不同:旧对象用
userName,新接口要求full_name -
数据类型/单位不一致:旧对象返回金额是
double元,新接口只接受int分 -
结构嵌套层级不同:旧对象把地址放在
user.addressStr字符串里,新接口需要拆成province、city、detail三个独立字段
写一个轻量级对象适配器类
推荐使用对象适配器(组合方式),它更安全、易测试,也避免单继承限制。以 Java 为例:
假设旧用户对象:
class OldUser {
String userName;
double balance;
String addr;
}新系统期望的接口:
interface UserInfo {
String getFullName();
int getBalanceInCents();
String getProvince();
}适配器实现:
class OldUserAdapter implements UserInfo {
private final OldUser oldUser;
<pre class='brush:java;toolbar:false;'>public OldUserAdapter(OldUser oldUser) {
this.oldUser = oldUser;
}
@Override
public String getFullName() {
return oldUser.userName != null ? oldUser.userName : "";
}
@Override
public int getBalanceInCents() {
return (int) Math.round(oldUser.balance * 100);
}
@Override
public String getProvince() {
if (oldUser.addr == null) return "";
String[] parts = oldUser.addr.split(" ");
return parts.length > 0 ? parts[0] : "";
}}
在调用链中自然替换,不侵入业务逻辑
适配器不是临时补丁,而是可复用的胶水组件。把它用在边界处:
- Controller 层接收旧数据时,立即包装成
UserInfo再传给 service - DAO 返回
OldUser后,由适配器转为统一UserInfo,供多个新模块消费 - 对外 API 响应前,用适配器统一格式,避免各处硬编码字段映射
配合工厂或构建器提升可维护性
当旧数据来源不止一种(如数据库查出的 OldUser、JSON 解析的 LegacyJsonUser),可引入简单工厂:
interface UserInfoFactory {
UserInfo from(Object source);
}
<p>class UserInfoFactoryImpl implements UserInfoFactory {
@Override
public UserInfo from(Object source) {
if (source instanceof OldUser) return new OldUserAdapter((OldUser) source);
if (source instanceof LegacyJsonUser) return new JsonUserAdapter((LegacyJsonUser) source);
throw new IllegalArgumentException("不支持的数据源类型");
}
}这样后续新增旧系统类型,只需加一个适配器类和工厂分支,主流程完全不动。

















