一文读懂设计模式--适配器模式
概述
Adapter pattern 适配器模式:将一个类的接口转换成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作。
上边定义说到的接口只是一个抽象的表示,可以是接口,也可以是类,也可以是对象。
所以适配器模式包括三类:对类的适配、对对象的适配和对接口的适配。
想要使用适配者设计模式,那么必须包括下边几个基本部分:
- 源类:系统原有的实现,被适配的角色。
- 适配者类:中介类,将原有的实现转换成目标实现
- 目标类:所期望的目标类。因为Java是单继承,所以就要求目标类是一个接口。
那么我们什么时候需要用到适配者模式呢?
(接下来这句话可能比较拗口哦)
客户想要使用目标类,但是目前系统中只有源类,所以我们必须使用一个适配类来完成他们的适配,保证我们使用这个适配类就相当于使用目标类。
总的来说:我们的目标就是是使用适配者类实现源类和目标类的适配。
接下来分别讲解这三种适配。
对类的适配
假设我们现在有一台电脑主机,想要将屏幕连接到主机上。主机上的接口是HDMI接口,但是屏幕的接口是VGA接口。但是如果使用正常的连接线(两端的公口和母口都是VGA或者都是HDMI)就不能将他们连接在一起,那么我们可以考虑使用转接线来完成。
在这个场景中:
- 目标类是HDMI接口
- 源类是VGA接口
- 适配器就是一个VGA -> HDMI的转接线
首先明确我们此时想要实现的目的:我们屏幕的接口是HDMI,想要把主机的VGA使用适配器转成HDMI。使用代码如下:
目标类:
/*** @author xxy* @date 2020/7/20* 目标接口,因为Java只支持单继承,所以目标类必须是接口。* 此时目标是先要获得一个HDMI的信号输入*/
public interface Target {void HDMIInput();
}
源类:
/*** @author xxy* @date 2020/7/20* 源类:被适配类,此时是一个VGA接口*/
public class Adaptee {public void VGAOutput() {System.out.println("此时是一个VGA接口...输出的VGA信号...");}
}
适配器类:
/*** @author xxy* @date 2020/7/20* 适配器类:此时就是一个VGA->HDMI的转接线*/
public class Adapter extends Adaptee implements Target {@Overridepublic void HDMIInput() {VGAOutput();System.out.println("我是一个转接器,能够将VGA转到HDMI....适配之后输出的是HDMI信号...");}
}
测试类如下:
/*** @author xxy* @date 2020/7/20* 测试类*/
public class Client {public static void main(String[] args) {Target client = new Adapter();client.HDMIInput();}
}
测试结果:
此时我们就是用一个适配类Adapter完成了Target和Adaptee的适配。表面上我们使用的是目标类,但是其实使用的适配类。
对对象的适配
对对象的适配就是创建适配类的时候将源类的对象注入进来就可以了,也就是通过组合方式来实现适配器功能。
目标类和源类和之前的代码都是一样的,只需要修改适配器类Adapter就可以了。
修改之后的Adapter如下:
/*** @author xxy* @date 2020/7/20* 适配器类:此时就是一个VGA->HDMI的转接线*/
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void HDMIInput() {adaptee.VGAOutput();System.out.println("我是一个转接器,能够将VGA转到HDMI....适配之后输出的是HDMI信号...");}
}
测试类如下:
/*** @author xxy* @date 2020/7/20* 测试类*/
public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target client = new Adapter(adaptee);client.HDMIInput();}
}
测试结果:
可以发现和之前对类的适配是一样的。
对于类的适配只能用在目标类是接口的情况下,因为被代理类是一个具体的类,由于Java的单继承,所以在类的适配模式下,目标类必须是接口。
相对于类的适配来说,对对象的适配能够实现相同的功能,但是对对象的适配可以用在目标类是一个类不是接口的情况下,因为被代理类是注入进来的,而不是通过继承的方式实现的。
对接口的适配
在很多情况下,一个接口中包含了很多的抽象方法,但是我们使用的时候根本用不到这些方法,只会使用其中一些。但是即使是用不到也要全部实现,虽然可以是一个空实现。
那么如何解决这种情况呢?可以让我们想使用什么方法就重写什么方法,而不用关心那些用不到的方法呢?
这种情况下我们也可以使用适配器模式解决,但是要使用对接口的适配。
源类代码如下:
/*** @author xxy* @date 2020/7/20* 源类:一个接口中包括许多抽象方法*/
public interface Person {void eat();void drink();void say();void move();void work();
}
适配者类:
/*** @author xxy* @date 2020/7/20* 适配器类:对源类Person进行了空实现,保证在使用的时候不需要自己实现所有的方法*/
public class PersonAdapter implements Person {@Overridepublic void eat() {}@Overridepublic void drink() {}@Overridepublic void say() {}@Overridepublic void move() {}@Overridepublic void work() {}
}
测试客户类如下:
/*** @author xxy* @date 2020/7/20* 客户类:只会使用到eat()方法,所以我们只需要关心eat()方法的重写就行了*/
public class PersonClient extends PersonAdapter {@Overridepublic void eat() {System.out.println("我想吃西瓜....");}
}
一文读懂设计模式--适配器模式相关推荐
- 一文读懂设计模式--策略模式
编写代码的时候,需要满足开闭原则,我们想要增加新的功能不能去改变源码,而应该在之前的基础上进行扩展. 加入客户有了新的需求,我们应该使用扩展的方式实现. 概述 策略模式,又叫算法簇模式,就是定义了不同 ...
- 一文搞懂设计模式--模板模式
Hi,大家好.今年的天气实在是太热了,七月份的厦门晒得我觉得身上冒出了烤肉香,不知道各位是否安好,但是在再热的天气也不能阻止我们学习的热情(doge).今天的主题是模板(Template Method ...
- 一文读懂HttpServletRequest
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 全网最全电子图书分享 你所需要的大数据视频 ...
- DDD - 一文读懂DDD领域驱动设计
一文读懂DDD领域驱动设计 1. 领域驱动设计简介 1.1 什么是领域驱动设计 1.2 为什么要用领域驱动设计 优点 缺点 2.3 领域驱动设计过程 2. 对于DDD,我们需要学习什么? 2.1 DD ...
- 从实验室走向大众,一文读懂Nanopore测序技术的发展及应用
关键词/Nanopore测序技术 文/基因慧 随着基因测序技术不断突破,二代测序的发展也将基因检测成本大幅降低.理想的测序方法,是对原始DNA模板进行直接.准确的测序,消除PCR扩增带来的偏差, ...
- 一文读懂Faster RCNN
来源:信息网络工程研究中心本文约7500字,建议阅读10+分钟 本文从四个切入点为你介绍Faster R-CNN网络. 经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在20 ...
- 福利 | 一文读懂系列文章精选集发布啦!
大数据时代已经悄然到来,越来越多的人希望学习一定的数据思维和技能来武装自己,虽然各种介绍大数据技术的文章每天都扑面而来,但纷繁又零散的知识常常让我们不知该从何入手:同时,为了感谢和回馈读者朋友对数据派 ...
- 一文读懂EfficientDet
一文读懂EfficientDet. 今年年初Google Brain团队在 CVPR 2020 上发布了 EfficientDet目标检测模型, EfficientDet是一系列可扩展的高效的目标检测 ...
- 一文读懂序列建模(deeplearning.ai)之序列模型与注意力机制
https://www.toutiao.com/a6663809864260649485/ 作者:Pulkit Sharma,2019年1月21日 翻译:陈之炎 校对:丁楠雅 本文约11000字,建议 ...
最新文章
- 软件测试员,你该如何快速提高自己的测试技术?
- 学习 Message(17): WM_SYSCOMMAND 消息[一]
- 学python需要什么基础知识-Python的学习,都需要具备哪些计算机基础知识?
- 绘图: matplotlib Basemap简介
- Vue.js 插件开发详解
- POJ 2185 Milking Grid KMP循环节周期
- 世嘉MD游戏开发【一】:win10环境下配置SGDK
- 校园网下桥接无法上网原理分析如何破解
- UVM糖果爱好者教程 - 22. Phasing
- 五款超级易用的网络监控软件
- LoRa SX1278通信代码开发学习
- H265编码视频流媒体播放器EasyPlayer.js支持9宫格视频同屏播放的写法
- 论简历解析及其步骤(一)步骤及理论
- 【硬件】军品钽电容(火炬电子)
- linux作为输出电脑声卡,今天终于搞定我的电脑的ALC883声卡linux驱动了
- 六个步骤教你用Xmind制作思维导图
- MIT2020年力作:机器学习加速器综述
- 考勤数据计算-Excel
- 寻找 DAO 的商业模式:对冲基金与初创企业的融合
- 信息学奥赛一本通 1373池塘钓鱼