模式概述
适配器模式(Adapter Pattern)是一种常用的结构型设计模式,它通过转换接口解决不同组件之间的兼容性问题,让原本不兼容的接口能够协同工作。
简单代码示例
场景描述:假设我们需要将第三方支付SDK(仅支持美元支付)集成到支持人民币支付的系统中
1. 类适配器实现(继承方式)
// 目标接口:人民币支付
interface RmbPayment {
void payInRmb(double amount);
}
// 适配者类:美元支付SDK
class UsdPaymentSdk {
void payInUsd(double amount) {
System.out.println("Paid $" + amount + " via USD SDK");
}
}
// 类适配器(继承)
class PaymentClassAdapter extends UsdPaymentSdk implements RmbPayment {
private static final double EXCHANGE_RATE = 6.5;
@Override
public void payInRmb(double rmbAmount) {
double usdAmount = rmbAmount / EXCHANGE_RATE;
super.payInUsd(usdAmount); // 调用父类方法
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
RmbPayment payment = new PaymentClassAdapter();
payment.payInRmb(650); // 支付650人民币
}
}
2. 对象适配器实现(组合方式)
// 对象适配器(组合)
class PaymentObjectAdapter implements RmbPayment {
private final UsdPaymentSdk usdPayment;
private static final double EXCHANGE_RATE = 6.5;
public PaymentObjectAdapter(UsdPaymentSdk usdPayment) {
this.usdPayment = usdPayment;
}
@Override
public void payInRmb(double rmbAmount) {
double usdAmount = rmbAmount / EXCHANGE_RATE;
usdPayment.payInUsd(usdAmount); // 委托给被适配对象
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
UsdPaymentSdk sdk = new UsdPaymentSdk();
RmbPayment payment = new PaymentObjectAdapter(sdk);
payment.payInRmb(650); // 支付650人民币
}
}
技术细节
1.模式组成
| 组件 | 职责说明 |
|---|---|
| 目标接口 | 客户端期望的接口 |
| 适配者类 | 需要被适配的现存组件 |
| 适配器 | 转换接口的中间件 |
2.两种实现方式
- 类适配器:通过继承实现
- 对象适配器:通过组合实现
模式应用
Spring MVC中的HandlerAdapter
核心作用:统一处理不同类型的Controller
// 简化版HandlerAdapter接口
public interface HandlerAdapter {
ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
}
// 注解控制器适配器
public class AnnotationMethodHandlerAdapter implements HandlerAdapter {
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// 将请求路由到@Controller注解的方法
// 转换不同参数类型(@RequestParam, @RequestBody等)
}
}
// 传统Controller适配器
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
((Controller) handler).handleRequest(request, response);
}
}
- DispatcherServlet获取HandlerMapping返回的Controller
- 遍历HandlerAdapter列表,找到支持该Controller类型的适配器
- 调用适配器的handle()方法执行请求处理
979

被折叠的 条评论
为什么被折叠?



