1.适配器模式

发布于:2025-02-25 ⋅ 阅读:(12) ⋅ 点赞:(0)

概述

适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。

适配器模式在业务场景中非常有用,尤其是在系统集成、接口兼容性处理以及代码复用等场景。以下是一个实际的业务场景示例:


业务场景:支付系统集成

假设你正在开发一个电商平台,需要集成多个第三方支付网关(如支付宝、微信支付、银联支付等)。每个支付网关的接口设计不同,但你的系统希望统一调用一个支付接口来处理所有支付请求。


1. 目标接口(统一的支付接口)

public interface PaymentGateway {
    void pay(double amount);
}

2. 需要适配的第三方支付类

支付宝支付
public class Alipay {
    public void alipayPayment(double amount) {
        System.out.println("支付宝支付:支付金额 " + amount);
    }
}
微信支付
public class WechatPay {
    public void wechatPayment(double amount) {
        System.out.println("微信支付:支付金额 " + amount);
    }
}

3. 适配器类

支付宝适配器
public class AlipayAdapter implements PaymentGateway {
    private Alipay alipay;

    public AlipayAdapter(Alipay alipay) {
        this.alipay = alipay;
    }

    @Override
    public void pay(double amount) {
        alipay.alipayPayment(amount); // 调用支付宝的支付方法
    }
}
微信支付适配器
public class WechatPayAdapter implements PaymentGateway {
    private WechatPay wechatPay;

    public WechatPayAdapter(WechatPay wechatPay) {
        this.wechatPay = wechatPay;
    }

    @Override
    public void pay(double amount) {
        wechatPay.wechatPayment(amount); // 调用微信支付的支付方法
    }
}

4. 客户端代码

public class PaymentSystem {
    public static void main(String[] args) {
        // 创建支付宝适配器
        PaymentGateway alipayGateway = new AlipayAdapter(new Alipay());
        alipayGateway.pay(100.0); // 调用统一的支付接口

        // 创建微信支付适配器
        PaymentGateway wechatGateway = new WechatPayAdapter(new WechatPay());
        wechatGateway.pay(200.0); // 调用统一的支付接口
    }
}

5. 输出

复制

支付宝支付:支付金额 100.0
微信支付:支付金额 200.0

业务场景总结

  1. 问题:第三方支付接口设计不一致,导致系统无法统一调用。

  2. 解决方案:使用适配器模式,为每个第三方支付接口创建一个适配器,将它们的接口转换为统一的 PaymentGateway 接口。

  3. 优点

    • 系统与第三方支付接口解耦,便于扩展新的支付方式。

    • 客户端代码只需调用统一的 PaymentGateway 接口,无需关心具体支付实现。

    • 符合开闭原则,新增支付方式时只需增加适配器,无需修改现有代码。


其他业务场景

  1. 日志系统集成:将不同日志框架(如 Log4j、SLF4J)适配到统一的日志接口。

  2. 数据格式转换:将不同数据格式(如 XML、JSON)转换为系统需要的格式。

  3. 旧系统升级:在新系统中复用旧系统的功能,通过适配器兼容旧接口。

适配器模式的核心思想是兼容性,它帮助我们在不修改现有代码的情况下,实现不同接口的协同工作。