聊聊适配器模式

目录

适配器模式概念

主要实现方式

主要组成

UML用例图

代码示例

生活场景

应用场景


适配器模式概念

适配器模式属于结构型设计模式,它的主要目的是将一个类的接口转换成客户端所期望的另一种接口形式,使得原本接口不兼容的类可以一起工作。

主要实现方式

  1. 类适配器。类适配器的实现需要支持多继承(如C++),因为该类型适配器是通过多继承被适配者和目标接口,由于目标接口可以是抽象类或者接口,被适配者可以是类或接口。所以两者都有可能是类。自然不适用于单继承。
  2. 对象适配器。对象适配器不需要多继承,单继承就行(如Java)。该类型适配器通过将被适配器者作为属性引用(就像Spring中的属性注入)。这种方式更加灵活,因为它不依赖于被适配者的具体实现,只需要知道它的接口即可。

主要组成

  1. 目标接口(target)。 客户端所期待的接口。目标接口可以是抽象类或接口,定义了客户端期望的方法。
  2. 被适配者(adaptee)。需要适配的类或接口。包含一些客户端可能需要的方法,但接口形式与客户端所期望的接口不兼容
  3. 适配器(adapter)。适配器类是核心,它将被适配者的接口转换成目标接口。主要有两种,类适配器对象适配器。通过实现目标接口,被适配者作为该类属性以及传入被适配者实例(适用对象适配器)或者继承被适配者类(适用类适配器),目的调用被适配者的方法。最终返回一个目标实例,也就是适配器实例,通过调用适配器中的方法,完成接口转换。

UML用例图

以对象适配器为例

代码示例

 以对象适配器为例,举个例子,生活中的插头有两脚的、三脚的,之间就需要转换。接下来使用代码将三脚转为两脚插头使用。

两脚插头接口(目标)

// 两脚插头接口
public interface TwoPinPlug {void connectionTwoPin();
}

三脚插头类(被适配者)

// 三角插头接口
public interface ThreePinPlug {void connectionThreePin();
}// 三角插头实现
public class ThreePinPlugImpl implements ThreePinPlug {@Overridepublic void connectionThreePin() {System.out.println("三角插头连接成功");}
}

适配器类

// 适配器类,将三脚转为两脚,实现两脚接口,成为两脚接口的子类
public class PlugPinAdapter implements TwoPinPlug {// 三角(源)属性注入private ThreePinPlug threePlug;// 有参构造,传入三脚(源)接口public PlugPinAdapter(ThreePinPlug threePlug) {this.threePlug = threePlug;}@Overridepublic void connection() {// 调用三脚(源)接口threePlug.connection();System.out.println("通过适配器转换...");System.out.println("转换成为两脚插头");}
}

客户端

public class Client {public static void main(String[] args) {// 创建一个三脚插头实例ThreePinPlugImpl threePlug = new ThreePinPlugImpl();// 创建插头适配器,传入三脚插头实例,返回两脚插头实例TwoPinPlug twoPinPlug = new PlugPinAdapter(threePlug);// 执行两脚插头实例方法(其实也是适配器中的方法)twoPinPlug.connectionTwoPin();}
}

结果

生活场景

  1. 耳机转换头:现在有的手机是没有耳机插孔的,但是充电的地方其实也可以充当耳机孔,这时候就需要耳机转换的适配器,转成手机支持的插孔。
  2. 电压转换器:生活中常见的充电器,就是将220V电压转换成充电设备支持的电压。

应用场景

  1. JDBC驱动程序:不同的数据库提供商实现了不同的JDBC驱动接口,使用适配器模式可以将这些不同的接口适配为标准的JDBC接口,提高应用程序的可移植性
  2. 处理器适配器(HandlerAdapter):SpringMVC工作流程中的出现的处理器适配器(HandlerAdapter),前端控制器(DispatcherServlet)会根据找到的处理器,选择一个合适的HandlerAdapter。HandlerAdapter有多个实现,用于适配不同类型的处理器。在这个过程中,处理器适配器(HandlerAdapter)起到了桥梁的作用,它连接了DispatcherServlet和具体的处理器(Controller),使得不同类型的处理器能够被统一调用和执行。

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

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

相关文章

暑假算法刷题日记 Day 10

目录 重点整理 054、 拼数 题目描述 输入格式 输出格式 输入输出样例 核心思路 代码 055、 求第k小的数 题目描述 输入格式 输出格式 输入输出样例 核心思路 代码 总结 这几天我们主要刷了洛谷上排序算法对应的一些题目,相对来说比较简单 一共是13道…

2024最新急速暴走小米运动自动刷步卡密版PHP源码

2023最新发布的急速暴走小米运动自动刷步卡密版PHP源码。该源码使用PHPTP6layui-Mini开发,旨在实现小米运动自动刷步功能。该程序支持通过微信修改步数,并采用卡密认证方式,用户只需提交提供的卡密,即可每日自助修改步数。 需要注…

Android 12系统源码_屏幕设备(二)DisplayAdapter和DisplayDevice的创建

前言 在Android 12系统源码_屏幕设备(一)DisplayManagerService的启动这篇文章中我们具体分析了DisplayManagerService 的启动流程,本篇文章我们将在这个的基础上具体来分析下设备屏幕适配器的创建过程。 一、注册屏幕适配器 系统是在Disp…

机器学习预处理

一、数据读取 数据的读取方式有多种,最终我们可以转化为numpy和pandas形式储存,方便后续的模型建立。 1.1 读取库的安装 需要用到的三个库 pip install pandas pip install numpy pip install openpyxl 1.2 库的使用 import pandas as pd ​ #### 1…

【故障处理】- ping不通的原因

PING不通是一个非常常见的网络问题,它可能由多种原因引起。如链路故障、ARP学习失败等 以一个Ping不通的尝试示例,介绍Ping不通故障的定位思路。如下图: PC3 Ping不通PC4 PC>ping 20.1.1.20Ping 20.1.1.20: 32 data bytes, Press Ctrl_C…

亚马逊铺货ERP国内采集,图片编辑文本翻译一键拉伸,自...

亚马逊全功能 ERP 铺货采集,自动生成 SKU。 说说国内平台采集的商品如何通过 ERP 自己做链接上传发布到亚马逊平台! 1. 首先进入 ERP 插件,直接点击 1688 平台采集自己想做的产品类型。各位按照自身的需求选择搜索的 JK,选择想采…

【GH】【EXCEL】P1: Write DATA SET from GH into EXCEL

文章目录 WriteFast WriteGH data material :GH process and components instructionFast Write DataFast Write Data & Clear DataFast Write to Cell EXCEL written results Write by ColumnGH data material :Compile ColumnGH process and components instructionWrite…

Redis RDB三两事

rdb:将数据库的快照以二进制格式保存在文件中,redis重启后直接加载数据。可以通过save和bgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则,例如 save 60 1000 如果60秒内不少于1000个key发生了改动,则生成一个新的rdb文件…

如何在C++ QT 程序中集成cef3开源浏览器组件去显示网页?

目录 1、问题描述 2、为什么选择cef3浏览器组件 3、cef3组件的介绍与下载 4、将cef3组件封装成sdk 5、如何使用cef3组件加载web页面 5.1、了解CefApp与CefClient 5.2、初始化与消息循环 5.3、如何创建浏览器 5.4、重载CefClient类 6、在qt客户端集成cef组件 7、最后…

什么是主机加固?主机加固的几种有效方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先…

Using Azure openAI key rotation automation

题意:使用 Azure OpenAI 密钥轮换自动化 问题背景: We are planning to do the Azure OpenAI key rotation automatically. How can we achieve this? Do we have terraform resource for this. 我们计划自动执行 Azure OpenAI 密钥轮换。我们如何实现…

运维小技能:通过调整JVM的默认内存配置来解决内存溢出(‌OutOfMemoryError)‌或栈溢出(‌StackOverflowError)‌等错误

文章目录 引言I 调整JVM的默认堆内存配置1.1 java命令启动jar包时配置JVM 的内存参数1.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数II 案例: Linux 操作系统设置tomcat的 JVM 的内存参数查找Tomcat位置: 快速定位服务状态和部署位置具体配置步骤扩展: 监测Nginx访…

Mysql查询日志

Mysql查询日志 Mysql查询日志默认是关闭状态的。 mysql> show variables like %general_log%; --------------------------------------- | Variable_name | Value | --------------------------------------- | general_log | OFF …

Python数分实战

学习视频:【课程3.0】Python基础与分析实战_哔哩哔哩_bilibili 由于学习过python进行数据分析,所以就简单记录一下,最主要学习的还是视频最后的两个项目,进行实战 之前想不明白明明有很智能的软件做数据分析,为什么还要…

C++票据查验、票据ocr、文字识别

现在,80、90后的人们逐渐过渡为职场上的主力人员,在工作中当然也会碰到各种各样的问题。比如,当你的老板给你一个艰难的任务时,肯定是不能直接拒绝的。那么我们该怎么做呢?翔云建议您先认真考虑老板说的任务的难度&…

倍福ADS通信教程

介绍 TwinCAT3 TwinCAT3是Beckhoff推出的一款基于PC的控制器软件,简单理解是一套集成开发环境,里边有各种分析工具以及通信中间件;开发者可以很方便的用它来进行IPC和PLC之间的通信连接 ADS 倍福ADS(‌Automation Device Spec…

WebRTC音视频开发读书笔记(六)

数据通道不仅可以发送文本消息, 还可以发送图片、二进制文件,将其类型binaryType属性设置成arraybuffer类型即可. 九\、文件传输 1、文件传输流程 (1)使用表单file打开本地文件 (2)使用FileReader读取文件的二进制数据 &#…

零基础学习Redis(5) -- redis单线程模型介绍

前面我们提到过,redis是单线程的,这期我们详细介绍一下redis的单线程模型 1. redis单线程模型 redis只使用一个线程处理所有的请求,并不是redis服务器进程内部只有一个线程,其实也存在多个线程,只不过多个线程是在处…

SparkSQL遵循ANSI标准

ANSI简介 ANSI Compliance通常指的是遵循美国国家标准学会(American National Standards Institute, ANSI)制定的标准。在计算机科学和技术领域,这通常涉及到数据库管理系统(DBMS)对于SQL语言的支持程度。 ANSI为SQL…

基于vue框架的爱学习分享平台ud317(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,学科分类,交流答疑,论坛交流,学习资料 开题报告内容 基于Vue框架的爱学习分享平台 开题报告 一、项目背景与意义 随着互联网技术的飞速发展,知识的获取与传播方式正经历着前所未有的变革。在线教育平台逐渐成为满足…