适配器模式介绍

目录

一、适配器模式介绍

1.1 适配器模式定义

1.2 适配器模式原理

1.2.1 适配器模式类图

1.2.2 模式角色说明

二、适配器模式的应用

2.1 类适配器模式

2.1.1 需求说明

2.1.2 需求实现

2.1.2.1 类图

2.1.2.2 具体实现

2.1.2.2.1 SDCard接口

2.1.2.2.2 SDCardImpl实现类

2.1.2.2.3 TFCard接口

2.1.2.2.4 TFCardImpl 实现类

2.1.2.2.5 SDAdapterTF适配类

2.1.2.2.6 Computer接口调用类

2.1.2.2.7 测试类

2.2 对象适配器模式

2.2.1 需求说明

2.2.2 需求实现

2.2.2.1 类图

2.2.2.2 具体实现

2.2.2.2.1 适配器实现类

2.2.2.2.2 测试类

三、适配器模式总结

3.1 适配器模式的优点

3.2 适配器模式的缺点

3.3 适配器模式适用的场景

3.4 代理、桥接、装饰器、适配器 4 种设计模式的区别


一、适配器模式介绍

1.1 适配器模式定义

适配器模式(adapter pattern )的原始定义是:将类的接口转换为客户期望的另一个接口,适配器可以让不兼容的两个类一起协同工作。

如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,
第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很多,手机充电器(将220v转换为5v的电压),读卡器等,其实就是使用到了适配器模式。

适配器模式是用来做适配,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。类适配器模式的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

1.2 适配器模式原理

1.2.1 适配器模式类图

1.2.2 模式角色说明

适配器模式(Adapter)包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:适配者即被适配的角色,它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

二、适配器模式的应用

2.1 类适配器模式

2.1.1 需求说明

假设现有一台电脑目前只能读取SD卡的信息,这时我们想要使用电脑读取TF卡的内容, 就需要将TF卡加上卡套,转换成SD卡!

2.1.2 需求实现

2.1.2.1 类图

2.1.2.2 具体实现
2.1.2.2.1 SDCard接口
package main.java.cn.test.adapter.V1;/*** @author ningzhaosheng* @date 2024/1/14 12:07:50* @description SD卡接口*/
public interface SDCard {//读取SD卡方法String readSD();//写入SD卡功能void writeSD(String msg);
}
2.1.2.2.2 SDCardImpl实现类
package main.java.cn.test.adapter.V1;/*** @author ningzhaosheng* @date 2024/1/14 12:08:21* @description SD卡实现类*/
public class SDCardImpl implements SDCard {@Overridepublic String readSD() {String msg = "sd card reading data";return msg;}@Overridepublic void writeSD(String msg) {System.out.println("sd card write data : " + msg);}
}
2.1.2.2.3 TFCard接口
package main.java.cn.test.adapter.V1;/*** @author ningzhaosheng* @date 2024/1/14 12:09:15* @description TF卡接口*/
public interface TFCard {//读取TF卡方法String readTF();//写入TF卡功能void writeTF(String msg);
}
2.1.2.2.4 TFCardImpl 实现类
package main.java.cn.test.adapter.V1;/*** @author ningzhaosheng* @date 2024/1/14 12:09:47* @description TF卡实现类*/
public class TFCardImpl implements TFCard {@Overridepublic String readTF() {String msg = "tf card reading data";return msg;}@Overridepublic void writeTF(String msg) {System.out.println("tf card write data : " + msg);}
}
2.1.2.2.5 SDAdapterTF适配类
package main.java.cn.test.adapter.V1;/*** @author ningzhaosheng* @date 2024/1/14 12:10:29* @description 定义适配器类(SD兼容TF)*/
public class SDAdapterTF extends TFCardImpl implements SDCard {@Overridepublic String readSD() {System.out.println("adapter read tf card ");return readTF();}@Overridepublic void writeSD(String msg) {System.out.println("adapter write tf card");writeTF(msg);}
}
2.1.2.2.6 Computer接口调用类
package main.java.cn.test.adapter.V1;/*** @author ningzhaosheng* @date 2024/1/14 12:13:15* @description*/
public class Computer{public String read(SDCard sdCard) {return sdCard.readSD();};
}
2.1.2.2.7 测试类
package main.java.cn.test.adapter.V1;/*** @author ningzhaosheng* @date 2024/1/14 12:11:39* @description 测试类*/
public class Test {public static void main(String[] args) {Computer computer = new Computer();SDCard sdCard = new SDCardImpl();System.out.println(computer.read(sdCard));System.out.println("========================");SDAdapterTF adapterTF = new SDAdapterTF();System.out.println(computer.read(adapterTF));}
}

2.2 对象适配器模式

2.2.1 需求说明

假设现有一台电脑目前只能读取SD卡的信息,这时我们想要使用电脑读取TF卡的内容, 就需要将TF卡加上卡套,转换成SD卡! 适用对象适配器模式实现。

2.2.2 需求实现

2.2.2.1 类图

2.2.2.2 具体实现
2.2.2.2.1 适配器实现类
package main.java.cn.test.adapter.V2;import main.java.cn.test.adapter.V1.SDCard;
import main.java.cn.test.adapter.V1.TFCard;/*** @author ningzhaosheng* @date 2024/1/14 12:31:54* @description 定义适配器类(SD兼容TF)*/
public class SDAdapterTF implements SDCard {private TFCard tfCard;public SDAdapterTF(TFCard tfCard) {this.tfCard = tfCard;}@Overridepublic String readSD() {System.out.println("adapter read tf card ");return tfCard.readTF();}@Overridepublic void writeSD(String msg) {System.out.println("adapter write tf card");tfCard.writeTF(msg);}
}
2.2.2.2.2 测试类
package main.java.cn.test.adapter.V2;import main.java.cn.test.adapter.V1.*;/*** @author ningzhaosheng* @date 2024/1/14 12:33:18* @description*/
public class Test2 {public static void main(String[] args) {Computer computer = new Computer();SDCard sdCard = new SDCardImpl();System.out.println(computer.read(sdCard));System.out.println("========================");TFCard tfCard = new TFCardImpl();SDAdapterTF adapterTF = new SDAdapterTF(tfCard);System.out.println(computer.read(adapterTF));}
}

三、适配器模式总结

3.1 适配器模式的优点

1. 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无序修改原有结构
2. 增加了类的透明性和复用性,将具体业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。
3. 灵活性和扩展性都非常好,通过使用配置文件可以很方便的更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,符合开闭原则。

3.2 适配器模式的缺点

  • 类适配器的缺点
  1. 对于Java等不支持多重继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者
  2. 适配者类不能为最终类
  • 对象适配器的缺点
  1. 与类适配器模式相比较,在该模式下要在适配器中置换适配者类的某些方法比较麻烦。

3.3 适配器模式适用的场景

  • 统一多个类的接口设计时

某个功能的实现依赖多个外部系统(或者说类)。通过适配器模式,将它们的接口适配为统一的接口定义

  • 需要依赖外部系统时

当我们把项目中依赖的一个外部系统替换为另一个外部系统的时候,利用适配器模式,可以减少对代码的改动

  • 原有接口无法修改时或者原有接口功能太老旧但又需要兼容;

JDK1.0 Enumeration 到 Iterator 的替换,适用适配器模式保留Enumeration 类,并将其实现替换为直接调用 Itertor。

  • 适配不同数据格式时;

Slf4j 日志框架,定义打印日志的统一接口,提供针对不同日志框架的适配器

3.4 代理、桥接、装饰器、适配器 4 种设计模式的区别

代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。但其各自的用意却不同,简单说一下它们之间的关系。

  • 代理模式:

代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。

  • 桥接模式:

桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。

  • 装饰器模式:

装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。

  • 适配器模式:

将一个类的接口转换为客户希望的另一个接口.适配器模式让那些不兼容的类可以一起工作。

好了,本次分享就到这里,欢迎大家继续阅读《设计模式》专栏其他设计模式内容,如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

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

相关文章

Intra-Inter Camera Similarity for Unsupervised Person Re-Identification

一、研究背景 1.由于人工标注样本昂贵,许多工作致力于通过以下手段进行无监督行人重识别: 域自适应:对齐源域、目标域特征分布 风格转换:使用生成对抗网络转换源域图片风格,并维持源域图片身份 伪标签生成:…

java.lang.UnsupportedOperationException: null 其一解决办法

文章目录 前言一、错误回顾1.详细信息2.代码详情 二、解决方案1.错误原因2.解决方案1.使用 new ObjectMapper() new TypeReference<List>(){}2.使用 SerializerFeature.WriteMapNullValue.getMask() 总结 前言 当我们远程调用传递泛型集合&#xff0c;如 List<?>…

【重明】机器视觉QT/C++实现工业相机二次开发框架

工业相机二次开发是机器视觉行业必不可少的技能之一。 而如何实现一个框架&#xff0c;能够兼容所有工业相机二次开发&#xff0c;从而支持多种类型的工业相机&#xff0c;就是机器视觉行业的进阶技能了。 重明工业相机二次开发项目就是在实现相机二开框架的基础上&#xff0c…

解决方案:reactNative通过webview跳转微信智能客服空白webview页面

在reactNative中使用webview跳转微信智能客服&#xff0c;功能正常&#xff0c;从微信退回到App时&#xff0c;会有一个空白的webview页面&#xff0c;在使用感觉上不是那么的顺滑。解决这个可以在webview中使用onLoadEnd方法来解决这个问题 在react-native-webview中onLoadEn…

计算机视觉开发工程师怎么考?报考难度大吗?证书含金量高吗?

为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求&#xff0c;深入实施人才强国战略和创新驱动发展战略&#xff0c;加强全国数字化人才队伍建设&#xff0c;持续推进人工智能专业人员…

Android 事件机制探讨(1)

事件的传递主要有三个方法&#xff1a;dispatchTouchEvent(事件分发)、onInterceptTouchEvent(事件拦截)、onTouchEvent(事件消费)。如下图&#xff1a; 仔细看的话&#xff0c;图分为3层&#xff0c;从上往下依次是Activity、ViewGroup、View事件从左上角那个白色箭头开始&…

法规更新美国玩具标准ASTM F963-17有更新,最新标准为ASTM F963-23

美国材料试验协会 (ASTM)在10月13日发布了新的玩具安全标准&#xff1a;ASTM F963-23&#xff0c;ASTM F963-17美国联邦法规16 CFR 1250还在使用当中&#xff0c;出口美国的玩具的厂商要引起重视。 ASTM F963-17是什么标准&#xff1f; ASTM F963-17是美国玩具检测标准&#…

Java基于SpringBoot+Vue的大学生入学审核系统的设计与开发,附源码、数据库

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

NFS网络共享存储服务技术攻略

目录 一.NFS 1.定义 2.特点 3.原理 二.服务端NFS配置文件 1.主配置文件 2.文件格式 3.相关命令 三.实验&#xff1a;NFS共享存储服务配置 1.服务端安装nfs-utils和rpcbind软件包 2.服务端新建共享目录给权限 3.服务端修改配置文件/etc/exports 4.服务端关闭防火墙…

C#开源免费的Blazor图表库

前言 今天分享一款基于ApexCharts.js封装的、C#开源免费的Blazor图表库&#xff1a;Blazor-ApexCharts。 10款值得推荐的Blazor UI组件库 全面的ASP.NET Core Blazor简介和快速入门 ApexCharts.js介绍 ApexCharts.js开源地址&#xff1a;GitHub - apexcharts/apexcharts.js:…

python.24.1.16函数

python自带函数 自定义函数 参数的使用

Java工具类——json字符串格式化处理

在我们拿到一团未经格式化的json字符串时&#xff0c;非常不方便查看&#xff0c;比如这样 {"APP_HEAD": {"TOTAL_NUM": "-1","PGUP_OR_PGDN": "0"},"SYS_HEAD": {"RET": [{"RET_CODE": &qu…

如何做用户分层和标签体系

“活动作了一场接一场&#xff0c;简直要累死了&#xff0c;拉进来的客户也没有多少&#xff0c;投入产出完全不成比例&#xff0c;怎么办&#xff1f;“ “有那么多注册用户&#xff0c;但是GMV怎么才这么点&#xff0c;他们怎么不买啊&#xff0c;难道都是羊毛党&#xff1f;…

el-select中多选回显数据后没法重新选择和更改

<el-form-item label"展示内容" prop"videoId"><el-select class"modal-input" multiple v-model"form.videoId"><el-optionclass"modal-input"v-for"(item) in videoIdTypes":key"item.id&q…

2019年认证杯SPSSPRO杯数学建模D题(第二阶段)5G时代引发的道路规划革命全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 D题 5G时代引发的道路规划革命 原题再现&#xff1a; 忙着回家或上班的司机们都知道交通堵塞既浪费时间又浪费燃料&#xff0c;甚至有的时候会带来情绪上的巨大影响&#xff0c;引发一系列的交通问题。据报道&#xff0c;每年交通拥堵使得美国…

【图形学】直线光栅化算法(DDA算法和Bresenham算法)

在数学上,直线就是由无穷多个点组成的, 在计算机屏幕显示的话, 需要做一些处理,对于光栅显示器&#xff0c;就是用有限多个点去逼近直线, 我们需要知道每一个像素点的坐标(都是整数) 数学上直线的方程如下 y k x b ykxb ykxb&#xff0c;给定直线的起点坐标 P 0 ( x 0 , y…

Spring Task 任务调度工具

大家好我是苏麟 , 今天聊聊Spring Task 任务调度工具 Spring Task Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a;定时任务框架 作用&#xff1a;定时自动执行某段Java代码 什么是定时任务 ? 通过时…

IP地址冲突警告!你的网络正在受到威胁

IP地址冲突是网络安全中的一个严重问题&#xff0c;可能导致网络不稳定、数据泄漏等严重后果。本文将深入探讨IP地址冲突的原因、影响以及如何应对&#xff0c;以提醒用户关注网络安全问题。 1. IP地址冲突的原因&#xff1a; 动态分配问题&#xff1a;在使用动态IP地址分配的…

spring boot学习第八篇:kafka

目录 1、安装kafka 1.1确认jdk是否安装OK 1.2下载&&安装kafka 1.3验证kafka 2、连接kafka 3、在java中操作kafka 1、安装kafka 1.1确认jdk是否安装Ok java -version 1.2下载&&安装kafka wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4…

面试Java岗老喜欢盯着JVM问,有那么多项目要调优吗?

面试Java岗老喜欢盯着JVM问&#xff0c;有那么多项目要调优吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给…