【设计模式系列】适配器模式(九)
目录
一、什么是适配器模式
二、适配器模式的角色
三、适配器模式的典型应用
四、适配器模式在InputStreamReader中的应用
一、什么是适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将不兼容的接口转换为一个客户端期望的另一个接口,从而使得原本不兼容的类可以一起工作。这种模式通常用于实现类之间的兼容,让它们可以无缝地协同工作。适配器模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
二、适配器模式的角色
-
目标接口(Target):定义客户端期望的接口。这个接口通常是抽象的,它规定了所有具体适配器必须遵守的契约。
-
适配者(Adaptee):定义了一个已经存在的接口,这个接口需要被适配以符合目标接口。适配者通常是一个具体的类,它包含了一些业务逻辑,但接口与目标接口不兼容。
-
适配器(Adapter):适配器是适配器模式的核心,它实现了目标接口,并与适配者协作以使得适配者可以按照目标接口的方式工作。适配器将客户端的请求转换为对适配者的调用。

三、适配器模式的典型应用
-
不同系统间的接口统一:在微服务架构中,不同服务可能有不同的接口风格,适配器模式可以用来统一这些接口,使得客户端可以以统一的方式与各个服务交互。
-
第三方库的集成:当需要使用第三方库,但其API与应用程序的期望接口不匹配时,可以通过适配器模式提供一个中间层,使得第三方库能够以符合应用程序接口的方式被使用。
-
数据访问层的适配:在数据库编程中,适配器模式可以用来创建一个统一的数据访问层,适配不同的数据库系统,如MySQL、Oracle、SQL Server等。
-
文件格式转换:在需要处理多种文件格式的应用中,适配器模式可以用来创建一个统一的文件处理接口,适配不同的文件格式。
-
API版本适配:当API升级后,为了保持向后兼容性,可以使用适配器模式来适配新旧API版本。
-
国际化和本地化:在需要支持多语言的应用中,适配器模式可以用来适配不同的语言和文化设置。
四、适配器模式在InputStreamReader中的应用
InputStreamReader 是 Java IO 流库中的一个类,它是一个桥梁,将字节流 InputStream 适配为字符流 Reader。这个适配过程遵循适配器模式,使得基于字节的输入流可以被当作基于字符的输入流来使用。以下是 InputStreamReader 在适配器模式中的具体应用说明:
角色对应
-
目标接口(Target):在适配器模式中,目标接口是客户端期望的接口。对于
InputStreamReader来说,目标接口是Reader,它是 Java IO 中用于读取字符流的接口。 -
适配者(Adaptee):适配者是已经存在的类,其接口需要被适配。在这里,适配者是
InputStream,它是 Java IO 中用于读取字节流的接口。 -
适配器(Adapter):适配器是实现目标接口并包含适配者引用的类。
InputStreamReader实现了Reader接口,并持有一个InputStream对象的引用,用于实际的字节读取操作。
应用过程
-
创建适配器:当需要从字节流中读取字符数据时,可以创建一个
InputStreamReader实例,并将字节流(如FileInputStream)作为参数传递给InputStreamReader的构造函数。 -
适配操作:
InputStreamReader将InputStream的read()方法调用适配为Reader的read()方法。这意味着,当客户端调用Reader的read()方法时,实际上是通过InputStreamReader调用了InputStream的read()方法。 -
字符编码转换:
InputStreamReader还负责将字节转换为字符,这个过程涉及到字符编码的处理。默认情况下,它使用平台默认的字符集,但也可以通过构造函数指定特定的字符集。
代码示例
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;public class InputStreamReaderExample {public static void main(String[] args) {try {// 创建字节流FileInputStream fis = new FileInputStream("example.txt");// 创建适配器,将字节流适配为字符流InputStreamReader isr = new InputStreamReader(fis);// 为了提高读取效率,可以进一步包装为BufferedReaderBufferedReader br = new BufferedReader(isr);// 读取数据String line;while ((line = br.readLine()) != null) {System.out.println(line);}// 关闭流br.close();isr.close();fis.close();} catch (IOException e) {e.printStackTrace();}}
}
在这个示例中,InputStreamReader 将 FileInputStream(字节流)适配为 Reader(字符流),然后通过 BufferedReader 进行高效的字符数据读取。这个过程展示了适配器模式在 Java IO 流中的典型应用,它使得字节流和字符流之间的转换变得简单而直接。
相关文章:
【设计模式系列】适配器模式(九)
目录 一、什么是适配器模式 二、适配器模式的角色 三、适配器模式的典型应用 四、适配器模式在InputStreamReader中的应用 一、什么是适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将不兼容的接口转换为一个客户端…...
C# 文档打印详解与示例
文章目录 一、概述二、PrintDocument 类的使用三、PrintDialog 类的使用四、PageSetupDialog 类的使用五、PrintPreviewDialog 类的使用六、完整示例七、总结 在软件开发过程中,文档打印是一个常见的功能需求。本文将详细介绍如何在C#中实现文档打印,并给…...
Spring Cloud --- Sentinel 熔断规则
熔断规则 慢调用比例 发送10个请求,每个请求理想响应时长为200毫秒。统计1秒钟,如果10个请求响应时间超过200毫秒的比例大于等于10%,则触发熔断,熔断5秒。 异常比例 1秒内,发送请求出现异常率为20%,则触…...
使用爬虫爬取Python中文开发者社区基础教程的数据
👨💻个人主页:开发者-曼亿点 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...
你了解kafka消息队列么?
消息队列概述 一. 消息队列组件二. 消息队列通信模式2.1 点对点模式2.2 发布/订阅模式 三. 消息队列的优缺点3.1 消息队列的优点3.2 消息队列的缺点 四. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者&…...
力扣102 二叉树的层序遍历 广度优先搜索
二叉树的层序遍历 题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15…...
堆(堆排序,TOP K, 优先级队列)
1 概念解释 堆的定义:堆是一颗完全二叉树,分为大堆和小堆 大堆:一棵树中,任何父亲节点都大于等于孩子的节点,大堆的根结点最大 小堆:一棵树中,任何父亲节点都小于等于孩子节点,小堆…...
(三)行为模式:11、模板模式(Template Pattern)(C++示例)
目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,将某些步骤…...
贝叶斯中的充分统计量
内容来源 贝叶斯统计(第二版)中国统计出版社 前两篇笔记简述经典统计中的充分统计量和判断充分统计量的 N e y m a n Neyman Neyman 因子分解定理 而在贝叶斯统计中,充分统计量也有一个充要条件 定理兼定义 设 x ( x 1 , x 2 , ⋯ , x …...
012:ArcGIS Server 10.2安装与站点创建教程
摘要:本文详细介绍地理信息系统服务器软件ArcGIS Server 10.2的安装与站点创建流程。 一、软件介绍 ArcGIS Server 10.2是Esri公司开发的一款强大的地理信息系统(GIS)服务器软件。它支持发布和共享地图、地理数据处理服务及空间分析功能&…...
xlive.dll错误的详细解决办法步骤教程,xlive.dll基本状况介绍
在计算机的众多文件中,“xlive.dll”扮演着独特而重要的角色。所以当你的电脑丢失了xlive.dll文件时,会倒是电脑不能正常运行,那么出现这样的问题有什么办法可以将丢失的xlive.dll进行修复呢?今天这篇文章将和大家聊聊xlive.dll错…...
通俗易懂的餐厅例子来讲解JVM
餐厅版本 JVM(Java虚拟机)可以想象成一个虚拟的计算机,它能够运行Java程序。为了让你更容易理解,我们可以用一个餐厅的比喻来解释JVM: 菜单(Java源代码): 想象一下,Java…...
Python从入门到高手7.3节-列表的常用操作方法
目录 7.3.1 列表常用操作方法 7.3.2 列表的添加 7.3.3 列表的查找 7.3.4 列表的修改 7.3.5 列表的删除 7.3.6 与列表有关的其它操作方法 7.3.7 与10月说再见 7.3.1 列表常用操作方法 列表类型是一种抽象数据类型,抽象数据类型定义了数据类型的操作方法。在本…...
Prompt提示词设计:如何让你的AI对话更智能?
Prompt设计:如何让你的AI对话更智能? 在人工智能的世界里,Prompt(提示词)就像是一把钥匙,能够解锁AI的潜力,让它更好地理解和响应你的需求。今天,我们就来聊聊如何通过精心设计的Pr…...
2024-10月的“冷饭热炒“--解读GUI Agent 之computer use?phone use?——多模态大语言模型的进阶之路
GUI Agent 之computer use?phone use?——多模态大语言模型的进阶之路 1.最新技术事件浅析三、思考和方案设计工具代码部分1.提示词2.工具类API定义,这里主要看computer tool就够了 总结 本文会总结概括这一应用的利弊,然后给出分析和工具代…...
Me 攒的GPT修改论文提示词
没有会员的GPT They demonstrated that QGAN exhibits an exponential advantage over classical methods when using data consisting of samples of measurements made on high-dimensional spaces. 作为related work 时态对吗? 有需要修改的吗?你可…...
关于在vue2中接受后端返回的二进制流并进行本地下载
后端接口返回: 前端需要在两个地方写代码: 1.封装接口处,responseType: blob 2.接收相应处 download() {if (this.selectionList.length 0) {this.$message.error("请选择要导出的数据!");} else {examineruleExport…...
[BUG]warn(f“Failed to load image Python extension: {e}“)的解决办法
在使用LlaMa-Factory工具包时,安装好环境后,输入llamafactory-cli env查看llama-factory的版本等信息时,bash提醒: /home/ubuntu/anaconda3/envs/Llama-Factory/lib/python3.10/site-packages/torchvision/io/image.py:13: UserW…...
配置MUX VLAN 的实验配置
概念和工作原理: MUX VLAN(Multiplex VLAN)是一种高级的VLAN技术,它通过在交换机上实现二层流量隔离和灵活的网络资源控制,提供了一种更为细致的网络管理方式。 概念与工作原理 基本概念: MUX VLAN通过定义主VLAN&am…...
高考相关 APP 案例分享
文章首发于https://qdgithub.com/article/2032 一、核心内容 (一)高考相关 APP 案例 圈友朱康分享高考相关的 APP。提到猿题库,其主要功能有练习册和猿辅导,都是收费的。猿题库出题给学生练习,将易错的总结起来出练习…...
ZYNQ PS-PL协同实战:如何设计一个带触发与延时的多通道数据采集卡?
ZYNQ PS-PL协同实战:工业级多通道数据采集卡架构设计精要 在工业自动化与测试测量领域,数据采集系统的性能直接决定了整个系统的可靠性与精度。Xilinx ZYNQ系列SoC凭借其独特的ARM处理器(PS)与可编程逻辑(PL)协同架构,成为构建高性能数据采集…...
3步掌握天龙八部单机版数据编辑:从游戏管家到创意设计师的蜕变之路
3步掌握天龙八部单机版数据编辑:从游戏管家到创意设计师的蜕变之路 【免费下载链接】TlbbGmTool 某网络游戏的单机版本GM工具 项目地址: https://gitcode.com/gh_mirrors/tl/TlbbGmTool 你是否曾在天龙八部单机版中遇到过这样的困扰:角色成长太慢…...
从零到一:基于STM32CubeMX与FSMC高效点亮TFT LCD屏的实战指南
1. 硬件准备与环境搭建 第一次接触STM32和TFT LCD屏时,我完全被各种接线和术语搞晕了。后来才发现,只要选对硬件组合,事情就成功了一半。我用的STM32F103ZET6开发板(俗称大容量版)和正点原子2.8寸LCD屏,这套…...
苹果A17芯片与台积电3nm工艺:技术解析与行业影响
1. 从3nm工艺说起:为什么A17芯片的制造选择如此关键每年秋季的苹果新品发布会,除了新iPhone的设计,最牵动科技圈神经的莫过于那颗全新的A系列仿生芯片。今年,关于iPhone 15系列将搭载A17芯片,并由台积电独家采用其第二…...
移动端大语言模型本地部署:从模型轻量化到推理引擎实战
1. 项目概述:当GPT遇见移动端,一个开源项目的诞生最近在GitHub上闲逛,发现了一个挺有意思的项目,叫Taewan-P/gpt_mobile。光看名字,你大概就能猜到它的核心:把类似GPT这样的大语言模型(LLM&…...
Touchpoint:命令行工具集中管理工作上下文,提升开发效率
1. 项目概述:一个被低估的开发者效率工具如果你和我一样,日常开发工作需要在多个代码仓库、项目管理工具(如Jira、Linear)、文档平台(如Confluence、Notion)和沟通软件(如Slack)之间…...
3分钟掌握猫抓扩展:轻松捕获网页视频的终极秘籍
3分钟掌握猫抓扩展:轻松捕获网页视频的终极秘籍 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过这样的情况࿱…...
Forge模组开发效率提升:Gradle插件自动化构建与热部署实践
1. 项目概述:一个为Forge模组开发者准备的“瑞士军刀”如果你是一名Minecraft Forge模组的开发者,或者你正打算踏入这个充满创造力的领域,那么你大概率经历过这样的场景:为了测试一个简单的功能改动,你需要反复地执行g…...
多维子集和问题:NP难问题的算法与应用解析
1. 多维子集和问题概述多维子集和问题(Multi-dimensional Subset Sum Problem)是计算复杂度理论中的经典NP难问题。简单来说,它要求在给定的n维向量集合中,找出一个子集,使得该子集中所有向量在每一维上的和恰好等于目标向量对应的分量。这个…...
探索下一代命令行界面:OpenCLI 架构设计与插件化实践
1. 项目概述:一个面向未来的命令行界面原型最近在开源社区里,我注意到一个名为sys-fairy-eve/nightly-mvp-2026-03-19-opencli的项目。这个标题信息量不小,它不像一个成熟的产品,更像是一个开发过程中的里程碑快照。sys-fairy-eve…...
