参考资料 - 掘金:漫话:如何给女朋友解释什么是适配器模式?
适配器可以将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。
示例场景:
计算机可以识别U盘,但是无法识别SD卡,
为了让计算机能够识别SD卡,我们需要有一个读卡器,将SD卡插入读卡器后,计算机识别读卡器,从而实现读取SD卡的目的。
那么在这个场景里,读卡器就是计算机和SD卡之间的适配器。
代码示例:
package com.cc.adapter;
/**
* 计算机接口,读取USB设备
* @author cc
* @date 21-12-20 23:02
*/
public interface Computer {
void readUSB();
}
package com.cc.adapter;
/**
* 读卡器
* @author cc
* @date 21-12-20 23:09
*/
public class SDReader {
void readSDCard() {
System.out.println("读取SD卡的内容");
}
}
package com.cc.adapter;
/**
* SD卡实体类
* @author cc
* @date 21-12-20 23:12
*/
public class SDCard {
private String content;
public SDCard(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
这个时候,计算机Computer是无法识别SDCard的,所以我们创建一个适配器(读卡器):
package com.cc.adapter;
/**
* 读取SD卡的适配器
* @author cc
* @date 21-12-20 23:09
*/
public class SDCardApapter implements Computer{
private SDReader sdReader;
public SDCardApapter(SDReader sdReader) {
this.sdReader = sdReader;
}
@Override
public void readUSB() {
sdReader.readSDCard();
}
}
测试一下:
package com.cc.adapter;
public class Main {
public static void main(String[] args) {
// SD卡实例
SDCard sdCard = new SDCard("这里是SD卡的内容");
// 读卡器
SDReader sdReader = new SDReader(sdCard);
// 计算机通过读卡器这个适配器读取到SD卡里的内容
Computer computer = new SDCardApapter(sdReader);
computer.readUSB();
}
}
结果:
这里是SD卡内容
示例代码很好的演示了适配器的作用:作为计算机和SD卡之间沟通的桥梁。
适配器的优缺点
优点:
- 可以复用已有的类和代码:只需要一个桥梁,不需要修改两边的代码
- 目标类(示例中的计算机)和适配者类(SD卡)解耦
- 符合开闭原则,可以很方便的更换适配器,不需要修改原有代码
缺点:
- 过多的使用适配器会让系统变得混乱,比如调用的是A的接口,实际上内部被适配成了调用B接口,系统内如果有太多这种情况,倒不如直接重构系统。
\