适配器模式的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。

对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作

原理很简单,我们再来看下它的代码实现。适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现
具体的代码实现如下所示。其中,

ITarget 表示要转化成的接口定义。
Adaptee 是一组不兼容 ITarget 接口定义的接口,
Adaptor 将 Adaptee 转化成一组符合 ITarget 接口定义的接口。

// 类适配器: 基于继承
public interface ITarget {void f1();void f2();void fc();
}public class Adaptee {public void fa() { //... }public void fb() { //... }public void fc() { //... }
}public class Adaptor extends Adaptee implements ITarget {public void f1() {super.fa();}public void f2() {//...重新实现f2()...}// 这里fc()不需要实现,直接继承自Adaptee,这是跟对象适配器最大的不同点
}// 对象适配器:基于组合
public interface ITarget {void f1();void f2();void fc();
}public class Adaptee {public void fa() { //... }public void fb() { //... }public void fc() { //... }
}public class Adaptor implements ITarget {private Adaptee adaptee;public Adaptor(Adaptee adaptee) {this.adaptee = adaptee;}public void f1() {adaptee.fa(); //委托给Adaptee}public void f2() {//...重新实现f2()...}public void fc() {adaptee.fc();}
}

针对这两种实现方式,在实际的开发中,到底该如何选择使用哪一种呢?判断的标准主要有两个,一个是 Adaptee 接口的个数,另一个是 Adaptee 和 ITarget 的契合程度。

  • 如果 Adaptee 接口并不多,那两种实现方式都可以。
  • 如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分都相同,那我们推荐使用类适配器,因为 Adaptor 复用父类 Adaptee 的接口,比起对象适配器的实现方式,Adaptor 的代码量要少一些。
  • 如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分都不相同,那我们推荐使用对象适配器,因为组合结构相对于继承更加灵活。

思考

  • 类适配器和对象适配器有何区别?

总结

  • 适配器模式用于修改不兼容的接口
  • 适配器模式 就是用一个Adaptor类把A接口转换为B接口
  • 设计的好就不需要适配器模式

适配器模式的原理与实现相关推荐

  1. 设计模式学习(五) 适配器模式

    结构型模式: ---  核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题 ---  分类: 适配器模式,代理模式,桥接模式,装饰模式,组合模式,外观模式,享元模式 适 ...

  2. java适配器模式 场景_Java设计模式之《适配器模式》及应用场景

    适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在. 适配器模式有两种:类适配器.对象适配器.接口适配器 前二者在实现 ...

  3. Javascript设计模式理论与实战:适配器模式

    有的时候在开发过程中,我们会发现,客户端需要的接口和提供的接口发生不兼容的问题.由于特殊的原因我们无法修改客户端接口.在这种情况下,我们需要适配现有接口和不兼容的类,这就要提到适配器模式.通过适配器, ...

  4. 趣谈设计模式 | 适配器模式(Adapter):如何让现存对象适用于新的环境?

    文章目录 案例:数据线转换器 适配器模式 "补偿"模式 总结 完整代码与文档 案例:数据线转换器 相信对于安卓用户,曾经或多或少都有着因为接口不适配而带来的苦恼.当你在更换手机时, ...

  5. Head First设计模式读书笔记六 第七章上 适配器模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: https://blog.csdn.net/u011109881/article/details/58261956 思想 要 ...

  6. 二十三种设计模式之:适配器模式

    适配器模式将某个类的接口转换成客户期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性的问题.主要分为三类:类的适配器模式,对象的适配器模式,接口的适配器模式. 1.类的适配器模式 实现思 ...

  7. 软件设计模式——适配器模式

    摘要 现实生活中的适配器例子,泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了. 1)适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个 ...

  8. 设计模式之美(8)-结构型-适配器模式

    适配器模式的原理与实现 适配器模式(Adapter Design Pattern).这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作. ...

  9. 适配器模式(类适配器,对象适配器,接口适配器)

    现实生活中的适配器例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器) ,这样就可以使用了. 基本介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一 ...

最新文章

  1. 又一年5.20,用Python助力程序员脱单大攻略(视频版)
  2. 如何使用jsp自定义标签 JspTag 使用入门
  3. Sharepoin学习笔记 —架构系列--02 Sharepoint的处理(Process)与执行模型(Trust Model) 1
  4. spring发送邮件
  5. 孙燕姿发博求推荐电动汽车,众多车企官微、老总亲自“上门”推销...
  6. 安卓项目中的R.java文件丢失如何解决
  7. 杂谈(23)也说高考
  8. Lucene全文检索(一)
  9. python 传参open
  10. [POI2006]ORK-Ploughing
  11. java基于springboot+vue的旧物置换网站
  12. 一键下载大学慕课等课程视频
  13. springboot vue导出excel 使用easypoi
  14. 如何搭建一个简单的QQ机器人(基于mirai)
  15. java盖章后原来印章模糊了_公章部分字迹盖不清楚怎么处理
  16. 数字地形模型(DTM)与地形分析 ( 来自:86VR)
  17. c语言中6 2等于多少,概率中C62怎么算(6是下标,2标在上面)
  18. java csv oracle数据库_从文件(*.csv或*.txt)导入Oracle数据库Java源代码
  19. 富龙热电:望眼欲穿矿难拿
  20. Frament与activity切换

热门文章

  1. html5表单与Jquery Ajax结合使用
  2. PyCharm社区版支持深度学习_在Windows的Ubuntu子系统运行支持CUDA的深度学习代码
  3. 阻止路由跳转得方式_vue中路由跳转的三种方式 简洁易懂
  4. The path ‘E:\ZERO‘ does not belong to a directory.
  5. 如何查看Android项目的gradle版本和路径
  6. java语言实现任何一种排序_请用java语言编写排序程序。
  7. 浙江独立学院计算机专业排名2015,2014-2015年中国独立学院排名
  8. python 通用数据库类型_Python开发基础之Python常用的数据类型
  9. python中trun是什么意思_Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解...
  10. matlab实验符号计算答案,2014秋实验四_MATLAB的符号计算二答案