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框架中发挥了关键作用,帮助框架整合了各种不同的接口和实现,提供了统一的访问点和接口,从而简化了开发人员的工作,提高了代码的可维护性和扩展性。

相关推荐
许野平17 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨20 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar28 分钟前
yelp数据集上识别潜在的热门商家
开发语言·python
duration~32 分钟前
Maven随笔
java·maven
zmgst35 分钟前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
跃ZHD44 分钟前
前后端分离,Jackson,Long精度丢失
java
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧1 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵1 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong1 小时前
Java反射
java·开发语言·反射