设计模式大白话——适配器模式

适配器模式

    • 概述
    • 示例
    • 适配器的种类
      • 小结

在这里插入图片描述

概述

​ 适配器其实非常好理解,放到生活中来,我们身边处处都有这样的例子,最常见的是用的比较多的各种转接线(如:USB 转 Type-C),有了这个“适配器”,我们就能够将电脑和手机等设备相进行连接,而不需要改动电脑/手机的原有接口。

示例

​ 回到编程的世界中,假设我们的某个程序一直依赖一个很久远的接口 OldBusinessInterface,这个时候由于业务需求,需要使用到比较新的接口 NewBusinessInterface,由于历史原因将不对旧的代码进行修改 ,因此目前的方案是将使用 适配器模式 去让 NewBusinessInterface 去适配 OldBusinessInterface

> 代码在线运行 <

package mainimport "fmt"// OldBusinessInterface 这是旧的接口
type OldBusinessInterface interface {OldBusinessMethodA(str string) intOldBusinessMethodB()
}// OldBusiness 这是旧的业务类,实现了旧的接口
type OldBusiness struct {
}func (o *OldBusiness) OldBusinessMethodA(str string) int {fmt.Println("OldBusinessMethodA is called")return len(str)
}func (o *OldBusiness) OldBusinessMethodB() {fmt.Println("OldBusinessMethodB is called")
}// NewBusinessInterface 这是新的接口
type NewBusinessInterface interface {NewBusinessMethodA(str string) int
}// NewBusiness 这是新的业务类,实现了新的接口
type NewBusiness struct {
}func (n *NewBusiness) NewBusinessMethodA(str string) int {fmt.Println("NewBusinessMethodA is called")return len(str)
}// OldBusinessMethod 这是旧的业务方法,依赖于旧的接口,但是新的业务类没有实现旧的接口
func OldBusinessMethod(a OldBusinessInterface) {a.OldBusinessMethodA("hello")
}// Adapter 这是适配器,实现了旧的接口,但是依赖于新的接口,这样就可以在旧的业务方法中使用新的业务类了
type Adapter struct {NewBusinessInterface
}func (a *Adapter) OldBusinessMethodA(str string) int {fmt.Println("[Adapter] OldBusinessMethodA is called")return a.NewBusinessMethodA(str)
}func (a *Adapter) OldBusinessMethodB() {fmt.Println("[Adapter] OldBusinessMethodB is called")
}func main() {// 旧的使用姿势OldBusinessMethod(&OldBusiness{})fmt.Println("------------------")// 使用适配器,可以在旧的业务方法中使用新的业务类了OldBusinessMethod(&Adapter{&NewBusiness{}})
}

运行结果:

OldBusinessMethodA is called
------------------
[Adapter] OldBusinessMethodA is called
NewBusinessMethodA is called

​ 通过适配器,我们能够将 B 接口变成 A 接口,通过这个方式,我们不需要再重新写一个新的实现类,而是只需要增加一个 适配器,这种感觉就是:你现在只有一个安卓充电线,但是你的手机是 Type-C 的接口,这个时候你只需要通过一个 转接线 就可以让 Type-C 接口的手机使用安卓充电线,而不用重新再买一个 Type-C 接口的充电器,这确实能够方便很多,当然,重新买一个充电器也并不是说不可取,这需要结合实际场景考虑各方面的因素来选择最合适的方案。

适配器的种类

​ 实际上,适配器有“两种”:对象适配器类适配器

  • 对象适配器

    在这里插入图片描述

  • 类适配器
    在这里插入图片描述

​ 其实本质上只是适配的目标不同而已,我们刚才的代码是针对接口而做的适配,其实就是对象适配器,对于类适配器,其实就是针对类型进行适配(在 Java 中,就是对 Class 进行的适配),使用此方式的前提条件是 编程语言支持多继承(如图,Adapter 继承了目标类和待适配的类)。

小结

  • 模式定义

    将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

​ 总结以上的内容,说白了,适配器其实就是一个中间层,可以让原本不兼容的接口转换成目标接口,最核心的是 “转换” 二字。如果你了解过外观模式和装饰模式,你可能会对他们三个感到有些困惑,分不清他们的差异,不用担心,我在之后的文章会对他们三个的差异做出解释。

​ 以上便是本篇的全部内容了,如果内容存在又问题的地方欢迎指点。

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

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

相关文章

Linux系统下建立Socket聊天服务器

目录 1.服务器结构 2.各模块函数 2.1 socket函数 2.2 bind函数 2.3 Listen函数 2.4 accept函数 2.5 接收发送函数 2.6 close函数 2.7 connect函数 3 代码段 3.1 服务器代码 1.服务器结构 使用socket的API函数编写服务端和客户端程序的步骤图示: 2.各模块函数 服务…

循环购模式:美妆行业的新趋势

美妆是一种能够提升自信和魅力的艺术&#xff0c;它让每个人都可以展现自己的个性和风格。但是&#xff0c;美妆也是一种需要不断更新和学习的技能&#xff0c;它需要消费者投入时间和金钱&#xff0c;才能找到适合自己的产品和方法。有没有一种方式&#xff0c;可以让美妆变得…

MySQL 数据库常用命令大全(详细)

文章目录 1. MySQL命令2. MySQL基础命令3. MySQL命令简介4. MySQL常用命令4.1 MySQL准备篇4.1.1 启动和停止MySQL服务4.1.2 修改MySQL账户密码4.1.3 MySQL的登陆和退出4.1.4 查看MySQL版本 4.2 DDL篇&#xff08;数据定义&#xff09;4.2.1 查询数据库4.2.2 创建数据库4.2.3 使…

[Linux]进程程序替换

[Linux]进程程序替换 文章目录 [Linux]进程程序替换进程程序替换的意义见一见进程程序替换进程程序替换的原理进程程序替换中的写时拷贝介绍进程程序替换接口 进程程序替换的意义 Linux系统下使用fork系统函数创建子进程后&#xff0c;子进程只能执行继承的部分父进程代码&…

cocos creator配置终端调试

在launch.json里添加"preLaunchTask":“CocosCreator compile” 在cocos creator里选择开发者&#xff0c;visual studio code工作流&#xff0c;选择添加编译任务。 添加 settings.json {"files.exclude":{"**/.git": true,"**/.DS_Sto…

哈希表HashMap(基于vector和list)

C数据结构与算法实现&#xff08;目录&#xff09; 1 什么是HashMap&#xff1f; 我们这里要实现的HashMap接口不会超过标准库的版本&#xff08;是一个子集&#xff09;。 HashMap是一种键值对容器&#xff08;关联容器&#xff09;&#xff0c;又叫字典。 和其他容易一样…

FFDNet-pytorch版本代码训练教程

一、FFDNet-pytorch版本代码下载 (1)FFDNet-pytorch下载 https://download.csdn.net/download/qq_41104871/88233742 (2)FFDNet-pytorch版本代码运行环境配置 https://blog.csdn.net/qq_41104871/article/details/132497008 二、FFDNet-pytorch版本代码训练教程 (1)按…

Elasticsearch 7.6 - Springboot应用基础操作篇

ES 7.6 - JAVA应用基础操作篇 环境准备依赖配置 实体类准备使用说明索引/映射操作创建索引和映射索引和映射相关查询删除索引 文档操作插入数据更新数据删除数据批量操作 文档查询根据ID查询根据字段精准查询根据字段分词查询控制返回字段范围查询组合查询排序分页高亮搜索聚合…

大数据平台数据脱敏是什么意思?有哪些方案?

大数据平台包含了海量多样化数据&#xff0c;所以保障大数据平台数据安全非常重要&#xff0c;数据脱敏就是手段之一。今天我们就来简单聊聊大数据平台数据脱敏是什么意思&#xff1f;有哪些方案&#xff1f; 大数据平台数据脱敏是什么意思&#xff1f; 大数据平台数据脱敏简…

matlab使用教程(27)—微分代数方程(DAE)求解

1.什么是微分代数方程&#xff1f; 微分代数方程是一类微分方程&#xff0c;其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量&#xff0c;代数变量的存在意味着您不能将这些方程记为显式形式 y ′ f t , y 。相反&#xff0c;您可以…

安全学习DAY20_自动化工具项目武器库介绍

信息打点-自动化工具 文章目录 信息打点-自动化工具本节思维导图&概述 各类红蓝队优秀工具项目集合&#xff1a;All-Defense-Tool 自动化-武器库部署F8x 自动化信息搜集-网络空间AsamF 自动化信息搜集-企查信息ENScan 自动化信息搜集-综合架构-ARL&NemoARL灯塔Nemo_Go …

javaCV实现java图片ocr提取文字效果

引入依赖&#xff1a; <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.5</version></dependency> 引入中文语言训练数据集&#xff1a;chi_sim GitHub - tesseract-ocr…

网络综合布线专业技能人才培养方案

一、网络综合布线专业技能人才培养方案概述 网络综合布线专业技能人才培养方案旨在培养具备综合布线系统设计、安装与维护的全面技能和知识的专业人才。以下是一个概述&#xff1a; 培养目标&#xff1a;培养具备综合布线系统的理论基础和实践操作技能的专业人才&#xff0c;能…

使用postman做接口测试

1.接口测试&#xff1a;针对软件对外提供服务的接口的输入输出进行测试&#xff0c;以及接口间相互逻辑的测试&#xff0c;验证接口功能与接口描述文档的一致性 2.接口测试流程&#xff1a; 1&#xff09;获取接口信息&#xff1a;通过接口文档或抓包来获取接口的基本调用方式和…

uniapp 微信小程序 锚点跳转

uniapp文档 以下是我遇到的业务场景&#xff0c;是点击商品分类的某一类 然后页面滚动至目标分类&#xff0c; 首先第一步是设置锚点跳转的目的地&#xff0c;在目标的dom上面添加id属性 然后给每个分类每一项添加点击事件&#xff0c;分类这里的item数据里面有一字段是和上…

SpringBoot初级开发--多环境配置的集成(9)

在Springboot的开发中&#xff0c;我们经常要切换各种各样的环境配置&#xff0c;比如现在是开发环境&#xff0c;然后又切换到生产环境&#xff0c;这个时候用多环境配置就是一个明智的选择。接下来我们沿用上一章的工程来配置多环境配置工程。 1.准备多环境配置文件 这里我…

Flutter 安装教程 + 运行教程

1.下载依赖 https://flutter.cn/docs/get-started/install/windows 解压完后根据自己的位置放置&#xff0c;如&#xff08;D:\flutter&#xff09; 注意 请勿将 Flutter 有特殊字符或空格的路径下。 请勿将 Flutter 安装在需要高权限的文件夹内&#xff0c;例如 C:\Program …

FireFox禁用HTTP2

问题 最近需要调试接口&#xff0c;但是&#xff0c;Chrome都是强制使用h2协议&#xff0c;即HTTP/2协议。为了排除h2协议排除对接口调用的影响&#xff0c;需要强制浏览器使用HTTP1协议。 解决 FireFox 设置firefox的network.http.http2.enabled为禁用&#xff0c;这样就禁…

[ros][ubuntu]ros在ubuntu18.04上工作空间创建和发布一个话题

构建catkin工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws/ catkin_make 配置环境变量 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 检查环境变量 echo $ROS_PACKAGE_PATH…

【NVIDIA CUDA】2023 CUDA夏令营编程模型(二)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…