精读《设计模式 - Adapter 适配器模式》
Adapter(适配器模式)
Adapter(适配器模式)属于结构型模式,别名 wrapper
,结构性模式关注的是如何组合类与对象,以获得更大的结构,我们平常工作大部分时间都在与这种设计模式打交道。
意图:将一个类的接口转换成客户希望的另一个接口。Adapter 模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。
这个设计模式的意图很好懂,就是把接口不兼容问题抹平。注意,也仅仅能解决接口不一致的问题,而不能解决功能不一致的问题。
举例子
如果看不懂上面的意图介绍,没有关系,设计模式需要在日常工作里用起来,结合例子可以加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。
接口转换器
插座的种类很多,我们都用过许多适配器,将不同的插头进行转换,可以在不替换插座的情况下正常使用。
USB 接口转换也同样精彩,有将 TypeC 接口转换为 TypeA 的,也有将 TypeA 接口转换为 TypeC 的,支持双向转换。
接口转换器就是我们在生活中使用到的适配器模式,因为厂商并没有生产一个新的插座,我们也没有因为接口不适配而换一个手机,一切只需要一个接口转换器即可,这就是运用设计模式的收益。
数据库 ORM
ORM 屏蔽了 SQL 这一层,带来的好处是不需要理解不同 SQL 语法之间的区别,对于通用功能,ORM 会根据不同的平台,比如 Postgresql、Mysql 进行 SQL 的转换。
对 ORM 来说,屏蔽不同平台的差异,就是利用适配器模式做到的。
API Deprecated
当一个广泛使用的库进行了含有 break change 的升级时,往往要留给开发者足够的时间去升级,而不能升级后就直接挂掉,因此被废弃的 API 要标记为 deprecated
,而这种被废弃标记的 API 的实际实现,往往是使用新的 API 替代,这种场景正是使用了适配器模式,将新的 API 适配到旧的 API,实现 API Deprecated。
意图解释
上面三个例子都满足下面两个条件:
API 不兼容:因为接口的不同;数据库 SQL 语法的不同;框架 API 的不同。
但能力已支持:插座都拥有充电或读取能力;不同的 SQL 都拥有查询数据库能力;新 API 覆盖了旧 API 的能力。
这样就可以通过适配器满足 Adapter 的意图:
意图:将一个类的接口转换成客户希望的另一个接口。Adapter 模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。
结构图
适配器的实现分为继承与组合模式。
下面是名词解释:
Adapter
适配器,把Adeptee
适配成Target
。Adaptee
被适配的内容,比如不兼容的接口。Target
适配为的内容,比如需要用的接口。
继承:
适配器继承 Adaptee
并实现 Target
,适用场景是 Adaptee
与 Target
结构类似的情况,因为这样只需要实现部分差异化即可。
组合:
组合的拓展性更强,但工作量更大,如果 Target
与 Adaptee
结构差异较大,适合用组合模式。
代码例子
下面例子使用 typescript 编写。
继承:
interface ITarget {// 标准方式是 hellohello: () => void
}class Adaptee {// 要被适配的类方法叫 sayHellosayHello() {console.log('hello')}
}// 适配器继承 Adaptee 并实现 ITarget
class Adapter extends Adaptee implements ITarget {hello() {// 用 sayHello 对接到 hellosuper.sayHello()}
}
组合:
interface ITarget {// 标准方式是 hellohello: () => void
}class Adaptee {// 要被适配的类方法叫 sayHellosayHello() {console.log('hello')}
}// 适配器继承 Adaptee 并实现 ITarget
class Adapter implements ITarget {private adaptee: Adaptee constructor(adaptee: Adaptee) {this.adaptee = adaptee}hello() {// 用 adaptee.sayHello 对接到 hellothis.adaptee.sayHello()}
}
弊端
使用适配器模式本身就可能是个问题,因为一个好的系统内部不应该做任何侨界,模型应该保持一致性。只有在如下情况才考虑使用适配器模式:
新老系统接替,改造成本非常高。
三方包适配。
新旧 API 兼容。
统一多个类的接口。一般可以结合工厂方法使用。
总结
适配器模式也复合开闭原则,在不对原有对象改造的前提下,构造一个适配器就能完成模块衔接。
适配器模式的实现分为类与对象模式,类模式用继承,对象模式用组合,分别适用于 Adaptee
与 Target
结构相似与结构差异较大的场景,在任何情况下,组合模式都是灵活性最高的。
最后用一张图概括一下适配器模式的思维:
精读《设计模式 - Adapter 适配器模式》相关推荐
- 【韩松】Deep Gradient Comression_一只神秘的大金毛_新浪博客
<Deep Gradient Compression> 作者韩松,清华电子系本科,Stanford PhD,深鉴科技联合创始人.主要的研究方向是,神经网络模型压缩以及硬件架构加速. 论文链 ...
- 【韩松】Deep Gradient Comression
<Deep Gradient Compression> 作者韩松,清华电子系本科,Stanford PhD,深鉴科技联合创始人.主要的研究方向是,神经网络模型压缩以及硬件架构加速. 论文链 ...
- [文献阅读] Sparsity in Deep Learning: Pruning and growth for efficient inference and training in NN
文章目录 1. 前言 2. Overview of Sparsity in Deep Learning 2.1 Generalization 2.2 performance and model sto ...
- 【翻译】Batch Normalization: Accelerating Deep Network Trainingby Reducing Internal Covariate Shift
Batch Normalization: Accelerating Deep Network Trainingby Reducing Internal Covariate Shift Sergey I ...
- 模型加速--CLIP-Q: Deep Network Compression Learning by In-Parallel Pruning-Quantization
CLIP-Q: Deep Network Compression Learning by In-Parallel Pruning-Quantization CVPR2018 http://www.sf ...
- 论文笔记30 -- (视频压缩)【CVPR2021】FVC: A New Framework towards Deep Video Compression in Feature Space
<FVC: A New Framework towards Deep Video Compression in Feature Space> CVPR 2021 的一篇Oral 提出了特征 ...
- 端到端图像压缩《Asymmetric Gained Deep Image Compression With Continuous Rate Adaptation》
Asymmetric Gained Deep Image Compression With Continuous Rate Adaptation 一 简介 二 内容 2.1 目前方法的缺陷 2.2 整 ...
- 深度学习视频压缩1—DVC: An End-to-end Deep Video Compression Framework
本文是第一篇端到端使用神经网络来进行视频压缩的论文, github地址:GitHub - GuoLusjtu/DVC: DVC: An End-to-end Deep Video Compressio ...
- 【论文阅读】Deep Compositional Captioning: Describing Novel Object Categories without Paired Training Data
[论文阅读]Deep Compositional Captioning: Describing Novel Object Categories without Paired Training Data ...
- CVPR 2018 TRACA:《Context-aware Deep Feature Compression for High-speed Visual Tracking》论文笔记
理解出错之处望不吝指正. 本文的模型叫做TRACA.模型中使用多个expert auto-encoder,在预训练阶段,每个expert auto-encoder针对一个特定类进行训练:在tracki ...
最新文章
- “头移植模型”论文称换头术可行 业内疑两大问题未解
- mds算法python函数_多维标度法(MDS)的Python实现
- 关于解决mybase7继续使用的方法
- 《Python Cookbook 3rd》笔记(5.17):将字节写入文本文件
- 外设驱动库开发笔记26:nRF24L01无线通讯驱动
- 编辑器eslint格式_ESlint 代码格式大坑vscode vetur,eslint 冲突
- 当深度学习走进高考考场,会发生什么!!
- Spark : ExitCodeException exitCode=15,exitCode=13
- NumPy 1.19.3 发布,Python 科学计算包
- HashMap的工作原理--重点----数据结构示意图的理解
- 解决eclipse/myeclipse导入项目时出现红色叹号的方法
- javascript生成m位随机数
- Smarty 获取当前日期时间和格式化日期时间
- 【图像去雾】基于matlab GUI直方图均衡化+Retinex理论图像去雾【含Matlab源码 1509期】
- SolidWorks学习日记
- 数据库(SQL)面试题,基础知识(超全面)
- 以生活中的例子快速理解十个设计模式
- F(x) - NU ABO 韩中(繁)ass字幕
- 工控系统 SCADA(监控和数据采集)系统简介
- 【Axure高保真原型】用户详细画像可视化原型模板