Java适配器模式源码剖析及使用场景

文章目录

  • 一、适配器模式介绍
  • 二、大白话理解
  • 三、 项目案例
  • 四、Java源码

一、适配器模式介绍

适配器模式(Adapter Pattern)是一种结构型设计模式,它作用于将一个类的接口转换成客户端所期望的另一种接口,从而使原本由于接口不兼容而无法一起工作的那些类可以在一起工作。它属于包装模式的一种。

适配器模式主要分为两种:

  • 类适配器: 通过继承的方式实现适配器功能
  • 对象适配器: 通过组合的方式实现适配器功能

二、大白话理解

适配器模式可以用生活中的插座转换器来理解。我们都知道,不同国家或地区使用的插座类型不尽相同。当你从国内带着笔记本电脑出国旅行时,由于插座类型的不同,可能无法为笔记本供电。这时就需要使用一个插座转换器,将你的笔记本电源插头适配到当地的插座上。这个转换器,就是一个很好的适配器模式实例。

在这个例子中:

  • 笔记本电脑的电源插头就是"被适配者"
  • 当地的插座就是"目标接口"
  • 插座转换器就是"适配器"

三、 项目案例

假设我们有一个第三方的老式圆孔接口 LegacyRoundHole 和一个新式方形接口 NewSquarePeg。现在需要将新式方形接口适配到老式圆孔接口上。我们可以通过创建一个适配器类 SquarePegAdapter 来实现适配,代码如下:

// 老式圆孔接口
interface LegacyRoundHole {void insertRoundPeg(RoundPeg peg);
}// 新式方形接口
interface NewSquarePeg {void insertSquarePeg();
}// 适配器(对象适配器方式)
class SquarePegAdapter implements LegacyRoundHole {private NewSquarePeg squarePeg;public SquarePegAdapter(NewSquarePeg squarePeg) {this.squarePeg = squarePeg;}@Overridepublic void insertRoundPeg(RoundPeg peg) {// 通过一些算法将方形适配到圆孔squarePeg.insertSquarePeg();}
}// 适配器(类适配器方式)
class SquarePegClassAdapter extends RoundPeg {private NewSquarePeg squarePeg;public SquarePegClassAdapter(NewSquarePeg squarePeg) {this.squarePeg = squarePeg;}@Overridepublic void insertIntoHole(LegacyRoundHole hole) {// 通过一些算法将方形适配到圆孔squarePeg.insertSquarePeg();}
}

在上面的代码中,我们分别使用对象适配器和类适配器的方式实现了适配器模式。

  • SquarePegAdapter 实现了旧接口 LegacyRoundHole,同时在内部持有一个新接口 NewSquarePeg 对象。当客户端调用 insertRoundPeg 方法时,适配器就会将请求转发给新接口对象,并通过一些算法进行适配。
  • SquarePegClassAdapter 继承了 RoundPeg 类,同时在内部持有一个新接口 NewSquarePeg 对象。当客户端调用 insertIntoHole 方法时,适配器就会将请求转发给新接口对象,并通过一些算法进行适配。

这样就实现了新旧接口的兼容。

四、Java源码

在Java源码中,适配器模式也有典型的应用,比如 java.util.Arrays#asList()

List<String> strs = Arrays.asList("a", "b", "c");

asList() 方法会返回一个包装好的 ArrayList 对象,里面装了传入的数组元素。这里 Arrays 类就相当于适配器,将基本的数组适配成了 List 类对象。

另一个例子是 java.io.InputStreamReaderjava.io.OutputStreamWriter:

Reader reader = new InputStreamReader(new FileInputStream("file.txt"), "UTF-8");
Writer writer = new OutputStreamWriter(new FileOutputStream("file.txt"), "UTF-8");

这两个类将低级的字节流适配成高级的字符流,屏蔽了字节与字符编码转换层的底层细节。InputStreamReaderOutputStreamWriter 起到了适配器的作用。

InputStreamReader 的源码中,我们可以看到它是如何将字节流适配成字符流的:

public class InputStreamReader extends Reader {private final StreamDecoder sd;public InputStreamReader(InputStream in, String charsetName) {super(in);try {sd = StreamDecoder.forInputStreamReader(in, this, charsetName);} catch (UnsupportedEncodingException uee) {throw new UnsupportedCharsetException(uee.getMessage());}}public int read() throws IOException {return sd.read();}// 其他方法
}

可以看到,InputStreamReader 内部持有一个 StreamDecoder 对象,它负责将字节解码成字符。当我们调用 read() 方法时,实际上是委托给 StreamDecoder 去读取和解码字节流。

适配器模式非常实用,在实际开发中经常会遇到接口不兼容的情况,通过使用适配器模式就可以让这些原本不兼容的类一起工作。

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

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

相关文章

Vue3中Vue Router的使用区别

在 Vue 3 中&#xff0c;useRouter 和 useRoute 是两个用于 Vue Router 的 Composition API 函数&#xff0c;它们的用途和返回的对象不同&#xff0c;接下来详细了解一下它们的区别以及如何正确使用它们。 useRouter useRouter 用于获取 router 实例&#xff0c;这个实例提供…

macOS14.4安装FFmpeg及编译FFmpeg源码

下载二进制及源码包 二进制 使用brew安装ffmpeg : brew install ffmpeg 成功更新到ffmpeg6.1 下载FFmpeg源码

MIT 6.858 计算机系统安全讲义 2014 秋季(三)

译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 SSL/TLS 和 HTTPS **注意&#xff1a;**这些讲座笔记略有修改自 2014 年 6.858 课程网站上发布的笔记。 这节课涉及两个相关主题&#xff1a; 如何在比 Kerberos 更大规模上加密保护网络通信&#xff1f; 技术&#xf…

LVS (Linux Virtual server)集群介绍

一 集群和分布式 &#xff08;一&#xff09;系统性能扩展方式&#xff1a; Scale UP&#xff1a;垂直扩展&#xff0c;向上扩展,增强&#xff0c;性能更强的计算机运行同样的服务 &#xff08;即升级单机的硬件设备&#xff09; Scale Out&#xff1a;水平扩展&#xff0…

Anaconda prompt运行打开jupyter notebook 指令出错解决方案

一、打不开jupyter notebook网页 报错如下&#xff1a; Traceback (most recent call last): File “D:\anaconda3\lib\site-packages\notebook\traittypes.py”, line 235, in _resolve_classes klass self._resolve_string(klass) File “C:\Users\DELL\AppData\Roaming\Py…

单文件组件SFC及Vue CLI脚手架的安装使用

单文件组件SFC及Vue CLI脚手架的安装使用 Vue 单文件组件&#xff08;又名 *.vue 文件&#xff0c;缩写为 SFC&#xff09;是一种特殊的文件格式&#xff0c;它允许将 Vue 组件的模板、逻辑 与 样式封装在单个文件中。 为什么要使用 SFC 使用 SFC 必须使用构建工具&#xff…

Pycharm jupyter server process exited with code 1

Pycharm jupyter server process exited with code 1 1. 问题描述2. 原因和解决方法 1. 问题描述 使用 Pycharm 启动 Jupyter 时&#xff0c;报错如下&#xff0c; jupyter server process exited with code 12. 原因和解决方法 Pycharm 启动 jupyter 时&#xff0c;默认的 …

Linux:开源世界的基石

Linux&#xff1a;开源世界的基石 在信息技术的海洋中&#xff0c;Linux像一座灯塔&#xff0c;照亮了开源文化的道路&#xff0c;成为了无数技术爱好者、开发者和企业的选择。作为一个操作系统的内核&#xff0c;Linux的出现犹如一阵清风&#xff0c;打破了操作系统市场的一统…

Vue class和style绑定:动态美化你的组件

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

考研经验|如何从考研失败中走出来?

对我来说&#xff0c;太丢人了 其实我在本科的时候在同学眼中&#xff0c;一直很优秀&#xff0c;每年奖学金必有我的&#xff0c;国家励志奖学金&#xff0c;国家奖学金&#xff0c;这种非常难拿的奖学金&#xff0c;我也拿过&#xff0c;本科期间学校有一个公费去新西兰留学的…

初识C语言—字符串、转义字符、注释

字符串 字符串就是一串字符 用英文双引号括起来的字符 int main() {"dasgfhjkasg\n""hello world!"return 0; } 字符串的结束标志是\0这个转义字符 如何证明呢&#xff1f; int main() {//字符数组 - 数组是一组相同类型的元素char arr[] "hel…

基于注解完成基本类型属性赋值 (DI)

在上一篇文章中&#xff0c;介绍了如何基于注解的方式自动为引用类型的属性赋值&#xff0c;这里介绍如何为基本类型的属性赋值。 为基本类型的属性赋值&#xff0c;使用注解Value。通常用于注入外部数据&#xff0c;或者我们可以直接手动赋值。 步骤如下&#xff1a; 声明外…

【个人开发】llama2部署实践(一)——基于CPU部署

1. Anaconda安装 mkdir -p /opt/anaconda cd /opt/anaconda # 参考链接&#xff1a;https://repo.anaconda.com/archive/index.html wget https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh sh Anaconda3-2023.07-2-Linux-x86_64.sh2.安装git yum inst…

【动态规划】代码随想录算法训练营第四十三天 |1049. 最后一块石头的重量 II,494. 目标和,474.一和零 (待补充)

1049. 最后一块石头的重量 II 1、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后…

PCB行业IPC标准内容介绍及子标准文件总结

🏡《总目录》 目录 1,概述2,标准内容简介3,IPC标准总结4,总结1,概述 IPC二级标准是针对电路板质量而制定的国际标准。它主要涉及到电路板的设计、制造和检验等方面,旨在确保电路板的质量、可靠性和性能达到一定的标准。 2,标准内容简介 IPC标准主要包括如下四个方面的…

Text Field文本输入框

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…

Ele admin pro和iView Admin pro的用户管理页面对比

Ele admin pro和iView Admin pro都是非常优秀的B端框架&#xff0c;功能大同小异&#xff0c;本文就着重比对一下二者的用户案例页面&#xff0c;让老铁们感知一些细节。 一、用户列表 用户列表 用户列表 二、用户编辑 三、用户添加 四、角色管理 五、权限分配 六、角色添加

我曾走在崩溃的边缘:俞敏洪亲述新东方创业发展之路 -- 读书笔记

读完这本书后&#xff0c;启发很大&#xff0c;尤其说的只要坚持做正确的事情&#xff0c;好的结果自然会来。人生就是一场马拉松&#xff0c;起起伏伏很正常&#xff0c;关键是要坚持做正确的事情&#xff0c;从绝望中寻找希望。这本书&#xff0c;是在微信阅读app上阅读的。 …

基于GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析

城市群是一国经济发展水平的象征&#xff0c;也是一国经济发展到一定阶段的标志&#xff0c;我国城市群建设体量不断增加&#xff0c;将成为全球经济的核心&#xff0c;中国城市群的建设逐步引领全球进入到了21世纪的中国新时代。然而&#xff0c;高速的城镇化发展&#xff0c;…

Elastic Stack--07--JavaAPI----文档(新增 、修改 、 查询 、 删除)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 JavaAPI-文档1.新增 Insert2.修改 Update3.查询 Get4.删除 Delete5.批量操作 BulkRequest批量新增批量删除 高级查询1.查询所有索引数据2.条件查询3.分页查询4.查询…