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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】gdb的简单使用

文章目录 一、gdb是什么?二、使用说明1. 安装2. 注意事项3. 常用调试指令3.1 gdb3.2 l3.3 r3.4 n3.5 s3.6 b3.7 info b3.8 finish3.9 p3.10 set var3.11 c3.12 d breakpoints3.13 d n3.14 disable/enable breakpoints3.15 disable/enable n3.16 info b3.17 display …

Supervisor答疑

引言 supervisor可以管理多个进程,安装也比较简单,可以使用apt或者是pip。 推荐使用apt安装。 问题 pip卸载问题 一开始的时候,这个机器并不是我安装的,但是能从pip列表中发现已安装, 但用pip卸载的时候&#xff0…

复习python函数

复习python函数 1.对函数的理解函数的传递方式返回值 return可通过help()函数查看函数说明作用域 2.不定长参数3.递归4.高阶函数将函数作为参数传递将函数作为返回值返回 5.匿名函数6.装饰器 1.对函数的理解 函数可以用来保存一些可执行的代码,并且可以在需要时&am…

macOS - OpenXSpell

文章目录 OpenXSpell、Xspell、OpenSpell使用 Xspell 本文翻译自:http://openxspell.sourceforge.net/ openxspell 源码:https://sourceforge.net/projects/openxspell/ OpenXSpell、Xspell、OpenSpell OpenXSpell 是 Mac 上的开源拼写检查工具。 从 OS…

如何给word中的拼音加声调?分享3个方法

一,前言 在Word文档中标注拼音声调,是许多人在处理中文文档时经常需要面对的问题。对于不熟悉拼音的人来说,这可能会是一个挑战。但是,通过掌握一些简单的步骤和技巧,我们可以轻松地在Word文档中标注拼音声调。 二&a…

wsl2 中docker安装完毕后无法正常启动

wsl2 中docker安装完毕后无法正常启动 1、背景2、目标3、环境4、原因4、操作5.1、查看配置5.2、 切换配置5.3、启动docker5.4、验证docker 1、背景 在win10中安装wsl2体验linux操作系统,按照docker官网步骤安装,安装完毕后面提示 $ docker ps Cannot co…

开源模型应用落地-LangChain高阶-集成vllm-QWen1.5(一)

一、前言 通过langchain框架调用本地模型,使得用户可以直接提出问题或发送指令,而无需担心具体的步骤或流程。vLLM是一个快速且易于使用的LLM推理和服务库。通过两者的结合,可以更好地处理对话,提供更智能、更准确的响应,从而提高对话系统的性能和用户体验。 二、术语 2.…

笨蛋学C++【C++基础第六弹】

C基础第六弹 C面向对象1.C类 & 对象1.1C类定义1.2C对象1.3访问数据成员1.4类成员函数1.5类访问修饰符公有public成员私有private成员受保护protected成员继承中的特点 1.6构造函数 & 析构函数类的构造函数带参数的构造函数使用初始化列表来初始化字段类的析构函数 1.7拷…

【软件工程中的螺旋模型】

文章目录 一、什么是螺旋模型?二、螺旋模型的工作流程1. 计划阶段2. 需求分析阶段3. 设计阶段4. 实施阶段5. 验证与确认阶段6. 进化阶段 三、螺旋模型的优点四、螺旋模型的缺点 一、什么是螺旋模型? 螺旋模型是一种风险驱动的软件开发过程模型&#xff…

云计算中的过度授权:安全隐患与应对策略

云计算凭借其弹性、可扩展等优势,已经成为诸多企业组织拓展业务的重要基础设施之一。然而,与传统IT架构相比,云计算环境的安全管理也面临着新的挑战。过度授权 (Overprivileging) 便是云安全领域亟待解决的主要问题之一,本文将带领…

为什么我的 Mac 运行缓慢以及如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展,越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现,它的使用逻辑与Windows存在很多不同,而且随着使用时间的增加,一些奇奇怪怪的文件也会占据有限的磁盘空间,进而影响使用…

Linux笔记之more命令分页显示内容

Linux笔记之more命令分页显示内容 code review! —— 2024-04-20 在 Unix 和类 Unix 操作系统中(如 Linux、macOS),more 命令是一个用于分页显示文本文件内容的工具。其基本功能是将长文本分割成逐页显示,用户可以逐页浏览而…

iOS 将字符串分割成单个字符| 字符串转成数组

iOS开发中我们常常需要对字符串进行出去,例如分割,通常都是有个参照物进行分割 例如: https://www.xxx.xxx?namezhangshan iOS需要取出zhangsan的值,就需要用参照物“name”进行分割,右边为张三,左边为其他字符串 OC自带的分割api是 componentsSeparatedByString:"&qu…

jasypt组件死锁bug案例分享

事故描述 1、上午9.55发布了一个Apollo动态配置参数; 2、片刻后,服务器接口开始出现大量的超时告警,似乎是某资源被耗尽不足分配; 3、正值业务请求高峰的上午十点(平台上午10点会有一些活动会拉一波用户流量&#x…

Vue3中使用i18n,this.$t报错

方案一 //需要把$t手动挂载到全局 //main.js app.config.globalProperties.$t i18n.global.t //需要使用的时候在组件里引用 import { getCurrentInstance } from vue const _this getCurrentInstance().appContext.config.globalProperties console.log($i18n,_this.$…

HTML表单(详解网页表单如何实现)

目录 一、表单介绍 1.概念 二、表单用法 1.HTML表单 2.HTML 表单 - 输入元素 2.1.文本域(Text Fields) 2.2.密码字段 2.3.单选按钮(Radio Buttons) 2.4.复选框(Checkboxes) 2.5.提交按钮(Submit)…

人人都是开发者的时代,学编程还有用吗?

欢迎大家在 GitHub 上 Star 我们: 分布式全链路因果学习系统 OpenASCE: https://github.com/Open-All-Scale-Causal-Engine/OpenASCE 大模型驱动的知识图谱 OpenSPG: https://github.com/OpenSPG/openspg 大规模图学习系统 OpenAGL: https://github.com/TuGraph-…

qt_standard_project_setup

qt_standard_project_setup的更先进的国际化。 这个camke命令的官方说明是:项目范围默认标准设置。 该命令在Qt6包的Core组件中定义,可以像这样加载: find_package(Qt6 REQUIRED COMPONENTS Core)这个命令是在Qt 6.3中引入的 qt_standard_project_set…

检查*.bib参考文献是否重复

安装bibtexparser pip install bibtexparser 代码 import bibtexparser from difflib import SequenceMatcherdef parse_bib_file(filename):with open(filename, r, encodingutf-8) as bibfile:bib_database bibtexparser.load(bibfile)return bib_database.entriesdef fi…

【电控笔记5.10】Luenberger估测器

Luenberger估测计 单积分器:pi控制器的补偿 双积分器:使用pid控制器的补偿 除了受控厂跟传感器,其他都在mcu 去掉Rs就是一个PLL锁相环 带宽比PLL更大