Java适配器案例如何兼容适配

wen java案例 22

本文目录导读:

Java适配器案例如何兼容适配

  1. 适配器模式的核心概念
  2. 实际案例:不同支付系统的兼容适配
  3. 兼容适配的关键点
  4. 适配器模式的使用建议

我来详细解释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("暂不支持退款");
    }
}

这个案例展示了如何通过适配器模式解决不同支付系统的兼容问题,让新旧系统能够无缝对接。

抱歉,评论功能暂时关闭!