本文目录导读:

我来详细解释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("暂不支持退款");
}
}
这个案例展示了如何通过适配器模式解决不同支付系统的兼容问题,让新旧系统能够无缝对接。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播