本文目录导读:

我来详细解释Java适配器模式的兼容适配案例,通过一个实际场景来说明。
适配器模式的核心概念
适配器模式用于解决接口不兼容的问题,让原本因接口不同无法工作的类能够协同工作。
实际案例:不同支付系统的兼容适配
场景描述
假设你的系统只支持支付宝支付,现在需要接入微信支付,但微信支付的接口完全不同。
定义目标接口(Target)
// 你的系统期望的支付接口
public interface Payment {
void pay(String orderId, double amount);
String queryStatus(String orderId);
}
现有的适配者(Adaptee)- 微信支付系统
// 微信支付的原生接口(不兼容)
public class WechatPay {
public String wechatPay(String tradeNo, double money) {
return "WX" + tradeNo; // 返回微信交易号
}
public String checkOrderStatus(String tradeNo) {
return "SUCCESS"; // 返回状态码
}
}
类适配器(通过继承实现)
// 类适配器:继承适配者,实现目标接口
public class WechatPayClassAdapter extends WechatPay implements Payment {
@Override
public void pay(String orderId, double amount) {
// 转换参数并调用微信支付
String wxTradeNo = wechatPay(orderId, amount);
System.out.println("微信支付成功,交易号:" + wxTradeNo);
}
@Override
public String queryStatus(String orderId) {
// 调用微信状态查询
String status = checkOrderStatus(orderId);
// 转换状态码为统一格式
if ("SUCCESS".equals(status)) {
return "已支付";
} else {
return "未支付";
}
}
}
对象适配器(通过组合实现)- 更推荐的方式
// 对象适配器:持有适配者对象,实现目标接口
public class WechatPayObjectAdapter implements Payment {
private WechatPay wechatPay; // 组合方式
public WechatPayObjectAdapter(WechatPay wechatPay) {
this.wechatPay = wechatPay;
}
@Override
public void pay(String orderId, double amount) {
// 参数转换和适配逻辑
String wxTradeNo = wechatPay.wechatPay(orderId, amount);
System.out.println("微信支付成功,交易号:" + wxTradeNo);
}
@Override
public String queryStatus(String orderId) {
String wxStatus = wechatPay.checkOrderStatus(orderId);
// 状态码转换
return "SUCCESS".equals(wxStatus) ? "已支付" : "未支付";
}
}
使用示例
public class AdapterDemo {
public static void main(String[] args) {
// 1. 使用类适配器
Payment payment1 = new WechatPayClassAdapter();
payment1.pay("ORDER001", 100.0);
String status1 = payment1.queryStatus("ORDER001");
System.out.println("订单状态:" + status1);
// 2. 使用对象适配器
WechatPay wechatPay = new WechatPay();
Payment payment2 = new WechatPayObjectAdapter(wechatPay);
payment2.pay("ORDER002", 200.0);
String status2 = payment2.queryStatus("ORDER002");
System.out.println("订单状态:" + status2);
}
}
更复杂的适配场景:多系统适配
// 多适配器统一管理
public class PaymentAdapterFactory {
public static Payment createAdapter(String type) {
switch (type) {
case "wechat":
return new WechatPayObjectAdapter(new WechatPay());
case "alipay":
// 假设支付宝是原生支持的,直接返回
return new AlipayPayment();
case "unionpay":
// 银联支付适配
return new UnionPayAdapter(new UnionPay());
default:
throw new IllegalArgumentException("不支持的支付类型");
}
}
}
// 使用工厂
public class OrderService {
public void processPayment(String paymentType, String orderId, double amount) {
Payment payment = PaymentAdapterFactory.createAdapter(paymentType);
payment.pay(orderId, amount);
}
}
兼容适配的关键点
接口转换
// 微信的接口签名 String wechatPay(String tradeNo, double money); // 适配后 void pay(String orderId, double amount);
参数映射
// 参数转换逻辑 String orderId → String tradeNo (可能需要进行格式转换) double amount → double money (单位转换等)
结果转换
// 微信返回的信息 String checkOrderStatus() → "SUCCESS"/"FAIL" // 转换为统一格式 "SUCCESS" → "已支付" "FAIL" → "未支付"
适配器模式的使用建议
适用场景
- 需要使用现有类,但接口不符合要求
- 创建可复用的类,与不相关的类协同工作
- 多个类的接口不统一时
优缺点
优点:
- 可以让任何两个没有关联的类一起运行
- 提高了类的复用性
- 灵活性好,可以动态添加适配器
缺点:
- 过多使用适配器会让系统结构复杂
- 建议在系统设计阶段就考虑接口统一
最佳实践
// 推荐使用对象适配器(组合)而不是类适配器(继承)
// 对象适配器更加灵活,可以适配适配者及其子类
// 接口设计时考虑扩展性
public interface Payment {
void pay(String orderId, double amount);
String queryStatus(String orderId);
// 方便未来扩展
default boolean refund(String orderId) {
throw new UnsupportedOperationException("暂不支持退款");
}
}
这个案例展示了如何通过适配器模式解决不同支付系统的兼容问题,让新旧系统能够无缝对接。