适配器模式(Adapter Pattern)

66 阅读2分钟

适配器模式(Adapter Pattern)将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

// 目标接口 - 统一支付接口
public interface PaymentProcessor {
    PaymentResult processPayment(double amount, String orderId);
}
// 支付结果类
public class PaymentResult {
    private boolean success;
    private String transactionId;
    private String message;

    // 构造函数、getter和setter方法
    public PaymentResult(boolean success, String transactionId, String message) {
        this.success = success;
        this.transactionId = transactionId;
        this.message = message;
    }

    // getter和setter方法
    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getTransactionId() {
        return transactionId;
    }

    public void setTransactionId(String transactionId) {
        this.transactionId = transactionId;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
// 适配者类 - 微信支付SDK
public class WechatPaySDK {
    public int sendPayment(String id, double fee) {
        System.out.println("使用微信支付 " + fee + " 元,订单号:" + id);
        // 模拟支付逻辑,返回0表示成功
        return 0;
    }
    
    public String getWechatTransactionId() {
        return "WX_" + System.currentTimeMillis();
    }
}

// 适配者类 - 银联支付SDK
public class UnionPaySDK {
    public boolean charge(String billId, double cost) {
        System.out.println("使用银联支付 " + cost + " 元,订单号:" + billId);
        // 模拟支付逻辑
        return true;
    }
    
    public String getUnionPayId() {
        return "UNION_" + System.currentTimeMillis();
    }
}
// 适配器类 - 支付宝支付适配器
public class AlipayAdapter implements PaymentProcessor {
    private AlipaySDK alipay;
    
    public AlipayAdapter() {
        this.alipay = new AlipaySDK();
    }
    
    @Override
    public PaymentResult processPayment(double amount, String orderId) {
        boolean success = alipay.pay(orderId, amount);
        String transactionId = success ? alipay.getTradeNo() : null;
        String message = success ? "支付宝支付成功" : "支付宝支付失败";
        
        return new PaymentResult(success, transactionId, message);
    }
}

// 适配器类 - 微信支付适配器
public class WechatPayAdapter implements PaymentProcessor {
    private WechatPaySDK wechatPay;
    
    public WechatPayAdapter() {
        this.wechatPay = new WechatPaySDK();
    }
    
    @Override
    public PaymentResult processPayment(double amount, String orderId) {
        int result = wechatPay.sendPayment(orderId, amount);
        boolean success = (result == 0);
        String transactionId = success ? wechatPay.getWechatTransactionId() : null;
        String message = success ? "微信支付成功" : "微信支付失败";
        
        return new PaymentResult(success, transactionId, message);
    }
}

// 适配器类 - 银联支付适配器
public class UnionPayAdapter implements PaymentProcessor {
    private UnionPaySDK unionPay;
    
    public UnionPayAdapter() {
        this.unionPay = new UnionPaySDK();
    }
    
    @Override
    public PaymentResult processPayment(double amount, String orderId) {
        boolean success = unionPay.charge(orderId, amount);
        String transactionId = success ? unionPay.getUnionPayId() : null;
        String message = success ? "银联支付成功" : "银联支付失败";
        
        return new PaymentResult(success, transactionId, message);
    }
}
// 客户端代码
public class ECommerceSystem {
    private PaymentProcessor paymentProcessor;
    
    public ECommerceSystem(PaymentProcessor paymentProcessor) {
        this.paymentProcessor = paymentProcessor;
    }
    
    public void checkout(double amount, String orderId) {
        System.out.println("开始处理订单支付...");
        PaymentResult result = paymentProcessor.processPayment(amount, orderId);
        
        if (result.isSuccess()) {
            System.out.println("支付成功!交易号:" + result.getTransactionId());
        } else {
            System.out.println("支付失败:" + result.getMessage());
        }
    }
    
    public static void main(String[] args) {
        // 使用支付宝支付
        ECommerceSystem alipaySystem = new ECommerceSystem(new AlipayAdapter());
        alipaySystem.checkout(99.9, "ORDER_001");
        
        System.out.println("-------------------");
        
        // 使用微信支付
        ECommerceSystem wechatSystem = new ECommerceSystem(new WechatPayAdapter());
        wechatSystem.checkout(199.9, "ORDER_002");
        
        System.out.println("-------------------");
        
        // 使用银联支付
        ECommerceSystem unionSystem = new ECommerceSystem(new UnionPayAdapter());
        unionSystem.checkout(299.9, "ORDER_003");
    }
}