Java设计模式_适配器模式

基础

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类能够一起工作。适配器模式通过创建一个包装类来实现这种兼容性,这个包装类包含了需要的目标接口,并持有一个适配者对象,以便进行转换。

组件

  • 目标接口(Target):定义客户端使用的特定接口。
  • 适配者类(Adaptee):存在的接口,但与目标接口不兼容。
  • 适配器类(Adapter):实现了目标接口,并持有一个适配者对象,用于执行实际的操作。

示例

老系统、新系统,适配器注入 老系统对象,且实现新系统接口重写 新系统方法同时在新方法内实际调用老系统的老方法

复制代码
// 适配者类
class OldSystem {
    public void oldMethod() {
        System.out.println("Old method is called.");
    }
}

// 目标接口
interface NewSystem {
    void newMethod();
}

// 适配器类
class Adapter implements NewSystem {
    private OldSystem oldSystem;

    public Adapter(OldSystem oldSystem) {
        this.oldSystem = oldSystem;
    }

    @Override
    public void newMethod() {
        oldSystem.oldMethod();
    }
}

应用

在Spring框架中,适配器模式是一个常用的设计模式,尤其是在Web MVC和AOP(面向切面编程)模块中。以下是Spring中使用适配器模式的一些典型场景:

1. Spring MVC中的处理器适配器(HandlerAdapter)

Spring MVC使用处理器适配器(HandlerAdapter)来适配不同类型的处理器(Handler)到MVC框架。例如,SimpleControllerHandlerAdapter适配器用于处理基于Controller接口的处理器,而HttpRequestHandlerAdapter适配器则用于处理HttpRequestHandler接口的处理器。

复制代码
@RequestMapping("/hello")
public class HelloWorldController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        // 处理请求逻辑
        return new ModelAndView("hello");
    }
}

2. Spring AOP中的通知适配器(AdviceAdapter)

Spring AOP使用通知适配器(AdviceAdapter)来适配不同类型的通知(Advice)到AOP框架。例如,MethodBeforeAdviceAdapter适配器用于处理前置通知,AfterReturningAdviceAdapter用于处理返回通知。

复制代码
@Before("execution(* com.example.service.*.*(..))")
public void beforeMethod() {
    // 执行前置通知逻辑
}

3. 数据访问中的适配器模式

Spring的数据访问框架(如JdbcTemplate、JPA、Hibernate)也使用适配器模式来适配不同的数据源和持久化技术。

复制代码
@Autowired
private JdbcTemplate jdbcTemplate;

public void saveData(Data data) {
    jdbcTemplate.update("INSERT INTO table_name (column1, column2) VALUES (?, ?)", data.getColumn1(), data.getColumn2());
}

适配器模式在Spring框架中发挥了关键作用,帮助框架整合了各种不同的接口和实现,提供了统一的访问点和接口,从而简化了开发人员的工作,提高了代码的可维护性和扩展性。

相关推荐
@淡 定10 分钟前
异常处理最佳实践
java
一起养小猫12 分钟前
LeetCode100天Day1-字符串匹配与Z字形变换
java·leetcode
白宇横流学长14 分钟前
基于SpringBoot实现的冬奥会科普平台设计与实现【源码+文档】
java·spring boot·后端
APIshop25 分钟前
Java爬虫1688详情api接口实战解析
java·开发语言·爬虫
Mr.Jessy43 分钟前
JavaScript高级:深浅拷贝、异常处理、防抖及节流
开发语言·前端·javascript·学习
bing.shao1 小时前
Golang 高并发秒杀系统踩坑
开发语言·后端·golang
Evan芙1 小时前
Tomcat内存机制以及按场景调优
java·tomcat
liwulin05061 小时前
【PYTHON-YOLOV8N】关于YOLO的推理训练图片的尺寸
开发语言·python·yolo
总爱写点小BUG1 小时前
打印不同的三角形(C语言)
java·c语言·算法
lsx2024061 小时前
C语言中的强制类型转换
开发语言