设计模式-适配器模式 Java

模式概述

适配器模式(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);
    }
}
  1. DispatcherServlet获取HandlerMapping返回的Controller
  2. 遍历HandlerAdapter列表,找到支持该Controller类型的适配器
  3. 调用适配器的handle()方法执行请求处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值