java适配器模式火鸡变凤凰是,结合案例深入解析适配器模式(一)
一、基本概念
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
可以将适配器理解为我们日常用的电脑充电器: 家庭电压为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适配器模式火鸡变凤凰是,结合案例深入解析适配器模式(一)相关推荐
- java适配器模式火鸡变凤凰是,读《HeadFirst设计模式》笔记之适配器模式
适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间 一个图很信息的说明适配器模式: 举个栗子: 还记得策略模式中的鸭子嘛!现在有一个火鸡想加入到鸭子的队列中 ...
- 麻雀如何变凤凰 by 网络雄猫
麻雀如何变凤凰 --IT认证思维思考 作者:田家昌(网络雄猫) 麻雀,灰不溜秋,一不下心闪了膀子,从屋檐下掉下来,肉都被人懒得吃,凤凰,乃神鸟也,人见人拜,从此变彼. 这都是我们的妄想,或者说是梦想, ...
- (转载)IT职场故事:新人如何菜鸟变凤凰
IT职场故事:新人如何菜鸟变凤凰 张锦喜 眼下,又一批毕业生走进了职场.换下学生时代一贯的T恤牛仔,穿上职业套装,由学生变身为职业人.在这些职场新鲜人的心里,除了满怀的兴奋和憧憬,还有一点对职场的忐忑 ...
- java 常见几种发送http请求案例
java 常见几种发送http请求案例 直接换成CloseableHttpClient还不行,需要这样使用CloseableHttpClient httpClient = HttpClientBuil ...
- Java实例开发教程:SpringBoot开发案例
最近在做邮件发送的服务,正常来说SpringBoot整合mail还是很方便的,然而来了新的需求:A请求使用邮箱C发送,B请求使用邮箱D发送,也就是说我们需要配置两套发送服务. 单实例 首先我们来看下单 ...
- Java文件合并变得语义化
与任何程序员交谈,并询问他应该如何进行合并:"它应该理解代码,对其进行解析,然后根据结构进行合并" –他很可能会说. 而这恰恰是SemanticMerge for Java所做的: ...
- Java定时任务(一) Timer及TimerTask的案例解析及源码分析
Java定时任务(一) Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...
- Java重构与TDD测试驱动开发实际案例一-陈勇-专题视频课程
Java重构与TDD测试驱动开发实际案例一-2117人已学习 课程介绍 本课程将高深的重构与TDD理论埋藏在一个实际案例中,深入浅出地演示了重构与TDD的完整步骤. 在这个真实的案例中 ...
- Java:计算机编程语言Java的简介、安装(编程环境/工具)、学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略
Java:计算机编程语言Java的简介.安装(编程环境/工具).学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编 ...
最新文章
- Codeforces-118D. Caesar's Legions(lazy dynamics)
- spring cloud config配置中心源码分析之注解@EnableConfigServer
- iOS - 解决设置导航栏按钮图片变色的问题
- python基础教程:python中@的用法
- span标签style的优先级_css样式引入优先级?
- RTX5 | 消息队列05 - 获取剩余空间,清空消息队列,删除消息队列
- Java学习——基本数据类型
- 类的加载过程(来一个通俗易懂的理解)
- 百度旋转验证码打码模块,集成鱼刺模块类
- python垃圾邮件识别_Python之机器学习-朴素贝叶斯(垃圾邮件分类)
- digispark使用
- zotero+坚果云同步
- C++图像处理 -- 图像翻转(镜像)
- PotPlayer播放器及安装说明
- 高德地图:2020中秋、国庆假期安全畅行指南
- java 字符串不等于_java中字符串不等于怎么判断
- PCDATA和CDATA区别
- 前端ers 必须知道的几个bootstrap cdn加速节点
- 使用RestTemplate请求第三方接口出错,没抛出异常?
- 让ie浏览器下载word,excel,而不是直接打开
热门文章
- 【HNUMSC】C语言第一讲
- Xshell设置Ctrl+c Ctrl+v快捷键为复制粘贴
- springboot中@Valid使用
- 芯片设计服务器配置,从AMD的“小芯片”设计,谈谈平衡的内存配置
- Oracle purge 用法介绍
- 【z3 solver手动安装】
- Halcon3d 点云计算平面度
- 基于 Vue3 + TypeScript 开发SSR系统(一):初始创建SSR
- android 程序退出函数,调查android logcat进程退出原因
- CSS 全局实现英文数字斜体而中文汉字正常显示