适配器模式:

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

官方定义不太好理解,我翻译一下,在适配器模式中,可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。
比如中国人家庭里面都用的国标的充电器,那插座肯定也是国标的,不然没有办法充电,但是当你买了一个港行的ipad的时候,他的充电器却是港版插头,为了能够正常充电,我们就需要买一个适配器(adapter),让港版插头也能够用在国标的插座上,对于用户来讲,他就把港版插头当做国标的插头来用。
如下图:

采用适配器模式的UML图:

通过UML图可以看到,适配器模式主要关联三个角色:

Target(目标接口):用户目标接口,即用户需要执行的动作。
Adapter(适配器类):通过实现目标接口,并持有被适配者的引用,把用户对目标接口的动作,委托给被适配者执行。
Adaptee(被适配者接口):这个接口需要适配。

目标接口:

/*** @Author: 欢迎关注公众号:程序员小安* @description: 国标充电器标准* @CreateDate: 2019/11/20* @Version: 1.0*/
public interface ChinaPlugTarget {/*** 通过中国标准供电*/void  powerWithChinastandard();
}

目标对象

/*** @Author: 欢迎关注公众号:程序员小安* @description:国标充电头* @CreateDate: 2019/11/20* @Version: 1.0*/
public class ChinaPlug implements ChinaPlugTarget {@Overridepublic void powerWithChinastandard() {System.out.println("使用国标充电头供电");}
}

被适配接口

/*** @Author: 欢迎关注公众号:程序员小安* @description: 港行充电器标准* @CreateDate: 2019/11/20* @Version: 1.0*/
public interface HongkongPlugAdaptee {/*** 通过香港标准供电*/void  powerWithHongkongstandard();
}

被适配者

/*** @Author: 欢迎关注公众号:程序员小安* @description:港行充电头* @CreateDate: 2019/11/20* @Version: 1.0*/
public class HongkongPlug implements HongkongPlugAdaptee {@Overridepublic void powerWithHongkongstandard() {System.out.println("使用港行充电头供电");}
}

适配器

/*** @Author: 欢迎关注公众号:程序员小安* @description:适配器* @CreateDate: 2019/11/20* @Version: 1.0*/
public class ChinaPlugAdapter implements ChinaPlugTarget {private HongkongPlugAdaptee hongkongPlugTarget;public ChinaPlugAdapter(HongkongPlugAdaptee hongkongPlugTarget) {this.hongkongPlugTarget = hongkongPlugTarget;}@Overridepublic void powerWithChinastandard() {hongkongPlugTarget.powerWithHongkongstandard();}
}

用户

public class User {public static void main(String[] args){ChinaPlug chinaPlug = new ChinaPlug();chinaPlug.powerWithChinastandard();HongkongPlug hongkongPlug = new HongkongPlug();ChinaPlugTarget chinaPlugAdaptee = new ChinaPlugAdapter(hongkongPlug);chinaPlugAdaptee.powerWithChinastandard();}
}

运行结果:

使用国标充电头供电
使用港行充电头供电

使用适配器的过程如下:
1.用户通过目标接口调用适配器的方法对适配器发出请求。
2.适配器使用被适配器接口把请求转换成被适配者的一个或多个调用接口。
3.客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。

采用适配器模式后,对于用户来说,他完全感知不到他在使用港行插头,用户可以很简单的把港版插头当做国标的插头来用。国标充电器标准接口是目标接口,港行充电头是被适配者,适配器实现目标接口,并且持有被适配器的引用,当用户调用适配器的目标方法时,其实是委托给被被适配器去执行。





类适配器
Adapter 类继承Adaptee (被适配类),同时实现Target 接口(因为 Java 不支持多继承,所以只能通过接口的方法来实现多继承)

对象适配器
Adapter类实现Target 接口,并持有Adaptee的引用,利用组合的方式将请求传递给被适配者。

适配器模式的优点
(1)通过创建适配器进行接口转换,让不兼容的接口变成兼容,这可以让目标类和适配者类解耦。
(2)灵活性和扩展性都非常好,符合开闭原则,我们想要改变接口时,适配器可以将改变的部分封装起来,用户不必为了应对不同的接口而每次跟着修改。
(3)使用对象组合,由于适配器持有被适配者的接口,而不是具体实例,也就是,被适配者的任何子类,都可以搭配着该适配器使用。

什么时候使用:
1 系统需要使用现有的类,而这些类的接口不符合系统的需要。
2 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3 需要一个统一的输出接口,而输入端的类型不可预知。


如有错误欢迎指出来,一起学习。

大厂面试必备之设计模式:漫画适配器模式相关推荐

  1. 大厂面试必备之设计模式:漫画装饰者模式

    小安实现的代码如下: /*** @Author: 欢迎关注公众号:程序员小安* @description:价格基类* 配菜通过成员变量动态设置* @CreateDate: 2020/3/6* @Ver ...

  2. Java开发进大厂面试必备技能,技术总监都拍手叫好

    前言 锁是一种用来控制多线程访问共享资源的工具.通常,锁可以独占共享资源:同一时间只有一个线程可以获得锁,并且所有访问共享资源的线程都必须首先获得锁.前面我们介绍过了synchronized,使用sy ...

  3. 只需 9.9 元!前 Facebook 工程师 7 天带你掌握 7 大数据结构,大厂面试必备!

    数据结构与算法是互联网大厂面试的敲门砖,也是开发者精益求精.持续提升的内功基础.工作中选择合适的数据结构,往往能达到事半功倍的效果.然而真正学习算法的时候,又是另外一番景象,因为真正基础.真正核心的东 ...

  4. 致Java开发者:Java外包是如何转正华为的?大厂面试必备技能

    前言 Spring无论在Java生态系统,还是在就业市场,是绝对的王者.大厂面试出镜率之高,投产规模之广,无出其右.随着技术的发展,Spring 从往日的 IoC 框架,已发展成 Cloud Nati ...

  5. 2019已经很冷,2020年Android工作或更难找——进大厂面试必备基础技能

    一.写在开头 在互联网行业里,2019年来到今天你能听到的消息都是什么样的? "某D公司开始裁员了" "某A公司据说冻结社招了" "据说J公司今年没有 ...

  6. 开源新作!三个月啃透888页Java王者级核心宝典,大厂面试必备技能

    前言 二面大概50分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜).回来之后把这些题目做了一个分类并整理出答案(强迫症的我狂补知识~)分为spring,jvm,并发编程等 ...

  7. Java开发必学:Java开发进大厂面试必备技能,技术总监都拍手叫好

    前言 作为同时具备高性能.高可靠和高可扩展性的典型键值数据库,Redis不仅功能强大,而且稳定,理所当然地成为了大型互联网公司的首选. 众多大厂在招聘的时候,不仅会要求面试者能简单地使用Redis,还 ...

  8. Kotlin学习(1)初识及环境搭建,大厂面试必备技能

    初始Kotlin语言 =========================================================================== Kotlin现在是Andr ...

  9. Android Studio 4,大厂面试必备

    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4' } 3.功能上的依存关系 在早期版本的 Android Gradle ...

  10. 2021年Java大厂面试必备面试题

    对java面试而言,面试前的准备一定要有面试题收集和学习这一项,因为在招聘公司看来,对java工程师职位的最大关注就是专业知识和技能水平的考察,所以程序员去公司面试,无论怎样都要先做一套面试题.对于不 ...

最新文章

  1. AI入侵机械设计,苦逼的“机械狗”还有未来吗?
  2. python 查看函数调用栈
  3. 新装WINDOWS XP系统 必须安装的十大高危漏洞补丁
  4. 【NOIP2013模拟联考5】军训(training)
  5. C++std::vector指定位置插入
  6. oracle元数据存储在表空间,oracle db中数据和元数据的概念
  7. java日志——基本日志+高级日志
  8. android uboot log,RK3288 Android 8.1系统uboot logo过渡到kernel logo会花一下
  9. 在osx 10.10.3 下安装git总结
  10. java8种基本类型长度_【Java基础】Java的8种基本数据类型深入介绍
  11. 离线安装IE11浏览器
  12. 阿里云部署hexo教程
  13. spss26没有典型相关性分析_【spss典型相关分析】数学建模__SPSS_典型相关分析
  14. Java对PDF进行电子签章CA签名认证
  15. [读书笔记]Mindset
  16. 显著性检测—谱残差方法分析与实现
  17. 5000字深度丨阿里巴巴用AI破局孕妇糖尿病
  18. 通过IP如何找到对应的MAC地址的
  19. 国内无线频谱资源分配图集
  20. android 6.0.1 精简,国行公开版Note4 N9100ZCS1DPK1 Android 6.0.1 精简卡刷版

热门文章

  1. 鸡兔同笼问题c语言编程,鸡兔同笼问题C语言程序编写
  2. Windows--IOmeter测试网络
  3. matlab h系统控制器,Matlab的H_inf鲁棒控制器的设计.pdf
  4. 程序员修炼之道(第2版)
  5. 进化算法求解TSP问题
  6. 解决客户一例:使用域超级管理员打开Exchange 2010发现没有权限
  7. 不用无限手套,人人都能开发 BI 系统
  8. 永洪BI-通过传输参数控制页面显示多少数据量
  9. mysql导入数据dmp文件怎么打开_如何在oracle中导入dmp数据库文件
  10. PyKeyBoardFairy可以替代你游戏中的卡键盘和鼠标宏