我终于读懂了适配器模式。。。

news/2024/4/29 9:57:01/文章来源:https://blog.csdn.net/csdnerM/article/details/127363686

文章目录🗾

    • 🌆什么是适配器模式?
    • 🏯类适配器模式
    • 🏰对象适配器模式
    • ⛺️接口适配器模式
    • 🏭适配器模式在SpringMVC 框架应用的源码剖析
    • 🗼适配器模式的注意事项和细节

🌆什么是适配器模式?

1)适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)
2)适配器模式属于结构型模式
3)主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

🏯类适配器模式

Adapter 类,通过继承 src(源) 类,实现 dst(目标) 类接口,完成 src->dst 的适配

类适配器模式应用实例

以生活中充电器的例子来讲解适配器,充电器本身相当于 Adapter,220V 交流电相当于 src (即被适配者),我们的目 dst(即 目标)是 5V 直流电

需要一个输出220V电压的类

在这里插入图片描述

需要一个输出5V电压的类

在这里插入图片描述

适配器类,通过继承220V类,实现5V类接口,完成的适配。

在这里插入图片描述

手机有个充电方法

在这里插入图片描述

客户端给他充电

在这里插入图片描述
类适配器模式注意事项和细节

1)Java 是单继承机制,所以类适配器需要继承 src 类这一点算是一个缺点, 因为这要求 dst 必须是接口,有一定局限性;
2)src 类的方法在 Adapter 中都会暴露出来,也增加了使用的成本。
3)由于其继承了 src 类,所以它可以根据需求重写 src 类的方法,使得 Adapter 的灵活性增强了。

🏰对象适配器模式

1)基本思路和类的适配器模式相同,只是将 Adapter 类作修改,不是继承 src 类,而是持有 src 类的实例,以解决兼容性的问题。 即:持有 src 类,实现 dst 类接口,完成 src->dst 的适配
2)根据“合成复用原则”,在系统中尽量使用关联关系(聚合)来替代继承关系。
3)对象适配器模式是适配器模式常用的一种

还是和刚刚的需求一样,只不过我们从继承5V类变成了持有他

在这里插入图片描述

客户端调用的时候传入220V的类即可

在这里插入图片描述
对象适配器模式注意事项和细节

1)对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。
根据合成复用原则,使用组合替代继承, 所以它解决了类适配器必须继承 src 的局限性问题,也不再要求 dst
必须是接口。
2)使用成本更低,更灵活。

⛺️接口适配器模式

1)一些书籍称为:适配器模式(Default Adapter Pattern)或缺省适配器模式。
2)核心思路:当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
3)适用于一个接口不想使用其所有的方法的情况。

我们有一个拥有四个方法的接口

在这里插入图片描述

在AbsAdapter 我们将 Interface4 的方法进行默认实现

在这里插入图片描述

调用的时候只需要去覆盖我们 需要使用 接口方法

在这里插入图片描述

🏭适配器模式在SpringMVC 框架应用的源码剖析

SpringMvc 中的 HandlerAdapter, 就使用了适配器模式

搜索DispatcherServlet这个类

在这里插入图片描述

找到doDispatch方法

在这里插入图片描述
在这里插入图片描述

🗼适配器模式的注意事项和细节

1)三种命名方式,是根据 src 是以怎样的形式给到 Adapter(在 Adapter 里的形式)来命名的。
2)类适配器:以类给到,在 Adapter 里,就是将 src 当做类,继承
对象适配器:以对象给到,在 Adapter 里,将 src 作为一个对象,持有接口适配器:以接口给到,在 Adapter 里,将 src 作为一个接口,实现
3)Adapter 模式最大的作用还是将原本不兼容的接口融合在一起工作。
4)实际开发中,实现起来不拘泥于我们讲解的三种经典形式

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design

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

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

相关文章

自学软件测试?一般人我还是劝你算了吧...

本人7年测试经验,在学测试之前对电脑的认知也就只限于上个网,玩个办公软件。这里不能跑题,我为啥说:自学软件测试,一般人我还是劝你算了吧?因为我就是那个一般人! 软件测试基础真的很简单&…

C# Socket

一 两个人在两个房间里打电话的图 ① 人通过【电话】可以通信; ② 程序通过【Socket】来通信; ③ *套接字 就是 程序间的电话机; ④ 我和孙权打电话 电话 规定好的语言; ⑤ 电脑和电话进行联系 协议; 二 Socket相关…

JVM(二十三)—— 垃圾回收器(三)G1垃圾回收器

G1垃圾回收器:区域化分代式G1概述G1的特点(优势)G1的缺点G1的参数设置G1的适用场景分区region:化整为零记忆集和写屏障G1回收器垃圾回收过程年轻代GC并发标记过程混合回收G1概述 应用程序所应对的业务越来越庞大,复杂&#xff0c…

【大数据】flink 读取文件数据写入ElasticSearch

前言 es是大数据存储的必备中间件之一,通过flink可以读取来自日志文件,kafka等外部数据源的数据,然后写入到es中,本篇将通过实例演示下完整的操作过程; 一、前置准备 1、提前搭建并开启es服务(本文使用doc…

图像分割 - Hough变换直线检测

目录 1. Hough 直线检测 2. HoughLinesP 函数 1. Hough 直线检测 霍夫变换(Hough 变换):利用对偶原理,把原空间的问题转换到对偶空间去求解 这里涉及到空间转换,将原来的笛卡尔空间(xy空间)…

App安全架构之前端安全防护

近年来,随着互联网、物联网、移动设备、5G通讯等技术的齐头发展,人类的生活和工作越来越离不开软件和互联网,正如人类社会文明发展到一定程度以后,会需要法律等社会规范来保护一样,线上环境也是一样道理。 Gartner 对…

Python学习小组课程-课程大纲与Python开发环境安装

一、前言 注意:此为内部小组学习资料,非售卖品,仅供学习参考。 为提升项目落地的逻辑思维能力,以及通过自我创造工具来提升工作效率,特成立Python学习小组。计划每周花一个小时进行在线会议直播学习,面向…

国内访问Github超级慢?那是你没有用我这个脚本。直接起飞。

导语 之前很多朋友咨询过国内访问Github较慢的问题,然后我一般让他们自己去知乎上找攻略,但今天我才发现网上竟然没有一个一键配置的脚本,一般都需要我们跟着教程一步步地去做才行。这也太麻烦了,于是自己动手写了个脚本&#xf…

ceph浅谈

总谈 ceph简介 用上ceph,多台机器的磁盘空间在一起了,在一台机器上就可以看到使用所有空间。 还可以保存多份安全备份 存储先ceph,自我管理修复,跨机房,节点越多,并行化,论上,节点越…

1-(3-磺酸基)丙基-1-甲基-2-吡咯烷酮三氟甲磺酸盐[C3SO3Hnmp]CF3SO3

1-(3-磺酸基)丙基-1-甲基-2-吡咯烷酮三氟甲磺酸盐[C3SO3Hnmp]CF3SO3 离子液体(IonicLiquids)是完全由离子组成,现在多指在低于100摄氏度时呈液体状态的熔盐。通常由特定的有机阳离子和无机阴离子(或有机阴离子)构成。 离子液体特点 蒸汽压…

C++基础——模板讲解

目录 一. 泛型编程 二. 函数模板 1.格式: 2.定义: 1.隐式实例化 2.显式实例化 3.解决方法3:使用多个T类型 4.在C中编译器允许非模板函数和模板函数同时存在 一. 泛型编程 先来看一段代码: void Swap(int& p1, int&am…

LeetCode:8. 字符串转换整数 (atoi)

8. 字符串转换整数 (atoi)1)题目2)思路3)代码4)结果1)题目 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数…

逻辑判断与正则表达式文本处理

上一篇文章分享了正则表达式的操作,这一篇文章就让我们一起看看正则表达式与逻辑判断结合起来会发生什么吧!感兴趣的小伙伴欢迎评论区或者是私信留言! 一、题目描述: 输入一个字符串,检查其是否为合法的python变量。输入$$$结束:…

数据结构【队列】

文章目录(一)队列定义(二)队列实现(1)创建结构体(2)具体函数实现及解析1.1 初始化队列1.2入队列1.3出队列1.4取队首元素1.5取队尾元素1.6返回队列个数1.7判断是否为空1.8销毁队列&am…

FITC标记的STAT1-ASON,绿色荧光素标记STAT1反义寡核苷酸,FITC-STAT1-ASON

产品名称:FITC标记的STAT1-ASON,绿色荧光素标记STAT1反义寡核苷酸 ​​​​​​​英文名称:FITC-STAT1-ASON STAT1 是第一个被发现的 STATs 家族成员,其编码基因位于 2 号染色体上,由 750 个氨基酸残基组成&#xff…

随想录一刷Day55——动态规划

文章目录Day55_动态规划47. 判断子序列48. 不同的子序列Day55_动态规划 47. 判断子序列 392. 判断子序列 思路: 双指针很简单,O(n)O(n)O(n) 时间就能解决 这里还是用dp dp[i][j] 表示以 s[i - 1] 结尾的字符串和以 t[]i-1 为结尾的字符串的最大子序列长…

Linux篇【5】:Linux 进程概念(二)

目录 3.5、查看进程 3.6、通过系统调用接口获取正在进行的进程的标识符 3.7、通过系统调用接口创建子进程 - fork 初识 3.5、查看进程 [HJMhjmlcc ~]$ clear [HJMhjmlcc ~]$ pwd /home/HJM [HJMhjmlcc ~]$ ls [HJMhjmlcc ~]$ touch mytest.c [HJMhjmlcc ~]$ ls mytest.c [H…

基于51单片机的简易数字计算器Proteus仿真

资料编号:115 下面是相关功能视频演示: 115-基于51单片机的简易数字计算器Proteus仿真(源码仿真全套资料)功能说明: 该计算器系统51 系列的单片机进行的数字计算器系统设计,可以完成计算器的键盘输入&…

一看就会的Java方法

文章目录一、方法的定义和使用🍑1、为什么引入方法?🍑2、方法的定义🍑3、方法调用的执行过程🍑4、实参和形参的关系二、方法重载🍑1、为什么需要方法重载🍑2、方法重载的概念和特点&#x1f351…

用DIV+CSS技术设计的体育主题网站(足球介绍)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…