1. 适配器模式概述
概念
- 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作那些类能一起工作
- 适配器模式适用于有相关性但不兼容的结构,源接口通过一个中间件转换后才可以适用于目标接口,这个转换过程就是适配,这个中间件就称之为适配器
特点
- 适配器模式并不推荐多用。因为未雨绸缪好过亡羊补牢,如果事先能预防接口不同的问题,不匹配问题就不会发生 ,只有遇到源接口无法改变时,才应该考虑使用适配器
- 适配器模式就像是一个补丁,只有在遇到接口无法修改时才应该考虑适配器模式。如果接口可以修改,那么将接口改为一致的方式会让程序结构更加良好
Demo
家庭电源提供 220V 的电压
1
2
3
4
5
6class HomeBattery {
int supply() {
// 家用电源提供一个 220V 的输出电压
return 220;
}
}USB 数据线只接收 5V 的充电电压
1
2
3
4
5
6
7
8class USBLine {
void charge(int volt) {
// 如果电压不是 5V,抛出异常
if (volt != 5) throw new IllegalArgumentException("只能接收 5V 电压");
// 如果电压是 5V,正常充电
System.out.println("正常充电");
}
}电源适配器
1
2
3
4
5
6
7class Adapter {
int convert(int homeVolt) {
// 适配过程:使用电阻、电容等器件将其降低为输出 5V
int chargeVolt = homeVolt - 215;
return chargeVolt;
}
}用户使用适配器将家庭电源提供的电压转换为充电电压
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class User {
@Test
public void chargeForPhone() {
HomeBattery homeBattery = new HomeBattery();
int homeVolt = homeBattery.supply();
System.out.println("家庭电源提供的电压是 " + homeVolt + "V");
Adapter adapter = new Adapter();
int chargeVolt = adapter.convert(homeVolt);
System.out.println("使用适配器将家庭电压转换成了 " + chargeVolt + "V");
USBLine usbLine = new USBLine();
usbLine.charge(chargeVolt);
}
}