适配器模式是一种结构型设计模式,用于将不兼容的接口转换为可兼容的接口。在Spring Boot中,它常用于整合第三方库、兼容旧系统或统一多个服务的接口。下面通过代码示例详解两种实现方式:类适配器和对象适配器。
场景描述
假设我们需要将两种不同的支付服务(AlipayService
和WechatPayService
)统一到PaymentService
接口中,但它们的接口方法不兼容。
- 目标接口
public interface PaymentService {
String pay(double amount);
}
- 被适配的类
// 支付宝支付(旧系统)
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中使用适配器
- 配置类注册适配器
@Configuration
public class AppConfig {
@Bean
public PaymentService alipayAdapter() {
return new AlipayAdapter(); // 类适配器
}
@Bean
public PaymentService wechatPayAdapter(WechatPayService wechatPayService) {
return new WechatPayAdapter(wechatPayService); // 对象适配器
}
}
- 控制器调用统一接口
@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