在Spring Boot中实现适配器模式的两种方式

在Spring Boot中实现适配器模式的两种方式

适配器模式是一种结构型设计模式,用于将不兼容的接口转换为可兼容的接口。在Spring Boot中,它常用于整合第三方库、兼容旧系统或统一多个服务的接口。下面通过代码示例详解两种实现方式:类适配器对象适配器

场景描述

假设我们需要将两种不同的支付服务(AlipayServiceWechatPayService)统一到PaymentService接口中,但它们的接口方法不兼容。

  1. 目标接口
public interface PaymentService {
    String pay(double amount);
}
  1. 被适配的类
// 支付宝支付(旧系统)
public class AlipayService {
    public String alipayPayment(double money) {
        return "Alipay: Paid " + money + " yuan";
    }
}

// 微信支付(第三方库)
public class WechatPayService {
    public String wechatPay(double fee) {
        return "WechatPay: Paid " + fee + " yuan";
    }
}

方式一:类适配器(继承实现)

通过继承被适配类并实现目标接口,重写目标方法调用父类逻辑。

@Component
public class AlipayAdapter extends AlipayService implements PaymentService {
    @Override
    public String pay(double amount) {
        // 调用父类被适配的方法
        return alipayPayment(amount);
    }
}

方式二:对象适配器(组合实现)

通过持有被适配对象的引用,在目标接口方法中委托调用。

@Component
public class WechatPayAdapter implements PaymentService {
    private final WechatPayService wechatPayService;

    // 通过构造器注入被适配对象
    public WechatPayAdapter(WechatPayService wechatPayService) {
        this.wechatPayService = wechatPayService;
    }

    @Override
    public String pay(double amount) {
        // 委托给被适配对象
        return wechatPayService.wechatPay(amount);
    }
}

在Spring Boot中使用适配器

  1. 配置类注册适配器
@Configuration
public class AppConfig {
    @Bean
    public PaymentService alipayAdapter() {
        return new AlipayAdapter(); // 类适配器
    }

    @Bean
    public PaymentService wechatPayAdapter(WechatPayService wechatPayService) {
        return new WechatPayAdapter(wechatPayService); // 对象适配器
    }
}
  1. 控制器调用统一接口
@RestController
public class PaymentController {
    @Autowired
    private List<PaymentService> paymentServices; // 注入所有适配器

    @PostMapping("/pay")
    public String handlePayment(@RequestParam String type, @RequestParam double amount) {
        return paymentServices.stream()
                .filter(service -> service.getClass().getSimpleName().toLowerCase().contains(type))
                .findFirst()
                .map(service -> service.pay(amount))
                .orElse("Unsupported payment type");
    }
}

两种方式对比

特性类适配器对象适配器
实现机制继承被适配类组合被适配对象
灵活性较低(Java单继承限制)较高(可适配多个不同对象)
耦合度高(直接继承具体类)低(依赖接口而非实现)
Spring整合难度简单(直接@Component)需显式注入被适配对象(推荐)
适用场景适配单一确定类适配多个类或需动态替换的场景

总结

  • 类适配器适合简单场景,通过继承快速实现,但缺乏灵活性。
  • 对象适配器符合Spring的依赖注入原则,解耦彻底,是更推荐的方式。
    在Spring Boot中,对象适配器能更好地利用IoC容器管理依赖,尤其当需要适配多个不同服务时,只需新增适配器而无需修改已有代码,符合开闭原则
© 版权声明
THE END
喜欢就支持一下吧
点赞14赞赏 分享