一、基本概念

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

可以将适配器理解为我们日常用的电脑充电器: 家庭电压为220V,而电脑充电频率是20V左右,所以需要适配。

二、结构

适配器可以分为两种: 对象适配器和类适配器。

对象适配器:

从用户的角度看不到被适配者。

用户调用适配器转换出来的目标接口方法。适配器再调用被适配者的相关接口方法。

用户收到反馈结果,感觉只是和目标接口交互。

类适配器:

通过多重继承目标接口和被适配者类方式来实现适配。

三、案例

案例: 将火鸡冒充成鸭子。

1、对象适配器模式

逻辑图:

代码组织结构图:

被适配者火鸡Turkey:

public interfaceTurkey {void gobble(); //火鸡叫声

voidfly();

}/**野火鸡*/

public class WildTurkey implementsTurkey{

@Overridepublic voidgobble() {

System.out.println("Go Go!");

}

@Overridepublic voidfly() {

System.out.println("I am Flying a short distance!");

}

}

目标对象Duck:

/**鸭子的接口*/

public interfaceDuck {void quack();//鸭子叫声

voidfly();

}

适配器TurkeyAdapter:

/*** 在外面表现是 鸭子(目标),但是实质是火鸡(被适配者)*/

public class TurkeyAdapter implements Duck { //实现目标的接口

private Turkey turkey; //这种对象型适配器必须要组合 被适配者,也就是要有适配者的引用

publicTurkeyAdapter(Turkey turkey) {this.turkey =turkey;

}//实际是火鸡在叫

@Overridepublic voidquack() {

turkey.gobble();//外面表现是quack,但是内部是turkey.gobble()

}

@Overridepublic voidfly() {//由于火鸡飞的短,所以多飞几次,让火鸡更像鸭子

for(int i = 0; i < 6; i++){

turkey.fly();

}

}

}

测试:

public classMyTest {public static voidmain(String[] args) {

WildTurkey turkey= newWildTurkey();

Duck duck= newTurkeyAdapter(turkey);

duck.quack();//看似是鸭子,其实内置是火鸡

duck.fly();

}

}

输出:

Go Go!I am Flying ashort distance!I am Flying ashort distance!I am Flying ashort distance!I am Flying ashort distance!I am Flying ashort distance!I am Flying ashort distance!

2、类适配器模式

基本结构图:

虽然Java不支持多继承,但是可以实现的同时继承。

只有TurkeyAdapter有一些代码变动,其他不变:

/*** 和 对象适配器模式唯一的不同就是 : 适配器直接继承 被适配者 (而不是组合)*/

public class TurkeyAdapter extends WildTurkey implementsDuck {

@Overridepublic voidquack() {super.gobble(); //直接继承 被适配者

}

@Overridepublic voidfly() {//让火鸡飞6次,飞的像鸭子

super.fly();super.fly();super.fly();super.fly();super.fly();super.fly();

}

}

测试:

public classMyTest {public static voidmain(String[] args) {

TurkeyAdapter duck= new TurkeyAdapter();//直接new即可

duck.quack();

duck.fly();

}

}

输出和上面对象适配器一样。

3、Java中从以前枚举器Enumeration到迭代器Iterator的适配

从Enumeration到Iterator适配的结构图:

一个实例代码:(下面EnumerationIterator就是一个适配器)

/**对象适配器的举例 java中的枚举到迭代器*/

public class EnumerationIterator implements Iterator{private Enumeration enumeration; //枚举 : 被适配者

publicEnumerationIterator(Enumeration enumeration) {this.enumeration =enumeration;

}

@Overridepublic booleanhasNext() {return enumeration.hasMoreElements(); //实际调用的是 被适配者 的方法

}

@OverridepublicObject next() {returnenumeration.nextElement();

}//这个可以说是适配器的缺点, 有些不能适配,比如两个插孔的插头不能适配为三个插孔的插头

@Overridepublic voidremove() {throw newUnsupportedOperationException();

}

}

四、总结

对象适配器和类适配器使用了不同的方法实现适配,对象适配器使用组合,类适配器使用继承。

免费Java高级资料需要自己领取,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G。

java适配器模式火鸡变凤凰是,结合案例深入解析适配器模式(一)相关推荐

  1. java适配器模式火鸡变凤凰是,读《HeadFirst设计模式》笔记之适配器模式

    适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间 一个图很信息的说明适配器模式: 举个栗子: 还记得策略模式中的鸭子嘛!现在有一个火鸡想加入到鸭子的队列中 ...

  2. 麻雀如何变凤凰 by 网络雄猫

    麻雀如何变凤凰 --IT认证思维思考 作者:田家昌(网络雄猫) 麻雀,灰不溜秋,一不下心闪了膀子,从屋檐下掉下来,肉都被人懒得吃,凤凰,乃神鸟也,人见人拜,从此变彼. 这都是我们的妄想,或者说是梦想, ...

  3. (转载)IT职场故事:新人如何菜鸟变凤凰

    IT职场故事:新人如何菜鸟变凤凰 张锦喜 眼下,又一批毕业生走进了职场.换下学生时代一贯的T恤牛仔,穿上职业套装,由学生变身为职业人.在这些职场新鲜人的心里,除了满怀的兴奋和憧憬,还有一点对职场的忐忑 ...

  4. java 常见几种发送http请求案例

    java 常见几种发送http请求案例 直接换成CloseableHttpClient还不行,需要这样使用CloseableHttpClient httpClient = HttpClientBuil ...

  5. Java实例开发教程:SpringBoot开发案例

    最近在做邮件发送的服务,正常来说SpringBoot整合mail还是很方便的,然而来了新的需求:A请求使用邮箱C发送,B请求使用邮箱D发送,也就是说我们需要配置两套发送服务. 单实例 首先我们来看下单 ...

  6. Java文件合并变得语义化

    与任何程序员交谈,并询问他应该如何进行合并:"它应该理解代码,对其进行解析,然后根据结构进行合并" –他很可能会说. 而这恰恰是SemanticMerge for Java所做的: ...

  7. Java定时任务(一) Timer及TimerTask的案例解析及源码分析

    Java定时任务(一)  Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...

  8. Java重构与TDD测试驱动开发实际案例一-陈勇-专题视频课程

    Java重构与TDD测试驱动开发实际案例一-2117人已学习 课程介绍         本课程将高深的重构与TDD理论埋藏在一个实际案例中,深入浅出地演示了重构与TDD的完整步骤. 在这个真实的案例中 ...

  9. Java:计算机编程语言Java的简介、安装(编程环境/工具)、学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略

    Java:计算机编程语言Java的简介.安装(编程环境/工具).学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编 ...

最新文章

  1. Codeforces-118D. Caesar's Legions(lazy dynamics)
  2. spring cloud config配置中心源码分析之注解@EnableConfigServer
  3. iOS - 解决设置导航栏按钮图片变色的问题
  4. python基础教程:python中@的用法
  5. span标签style的优先级_css样式引入优先级?
  6. RTX5 | 消息队列05 - 获取剩余空间,清空消息队列,删除消息队列
  7. Java学习——基本数据类型
  8. 类的加载过程(来一个通俗易懂的理解)
  9. 百度旋转验证码打码模块,集成鱼刺模块类
  10. python垃圾邮件识别_Python之机器学习-朴素贝叶斯(垃圾邮件分类)
  11. digispark使用
  12. zotero+坚果云同步
  13. C++图像处理 -- 图像翻转(镜像)
  14. PotPlayer播放器及安装说明
  15. 高德地图:2020中秋、国庆假期安全畅行指南
  16. java 字符串不等于_java中字符串不等于怎么判断
  17. PCDATA和CDATA区别
  18. 前端ers 必须知道的几个bootstrap cdn加速节点
  19. 使用RestTemplate请求第三方接口出错,没抛出异常?
  20. 让ie浏览器下载word,excel,而不是直接打开

热门文章

  1. 【HNUMSC】C语言第一讲
  2. Xshell设置Ctrl+c Ctrl+v快捷键为复制粘贴
  3. springboot中@Valid使用
  4. 芯片设计服务器配置,从AMD的“小芯片”设计,谈谈平衡的内存配置
  5. Oracle purge 用法介绍
  6. 【z3 solver手动安装】
  7. Halcon3d 点云计算平面度
  8. 基于 Vue3 + TypeScript 开发SSR系统(一):初始创建SSR
  9. android 程序退出函数,调查android logcat进程退出原因
  10. CSS 全局实现英文数字斜体而中文汉字正常显示