定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
案例:现在有一台MiniTV(微型电视机),需要110V电压的电流,但是只有220V电压的电池。这样,我们就可以定义一个变压器,将电池的电压降低,提供给TV使用。
代码:
电视机(需要110V的电压)
/**
* 电视机,需要110伏特的电流
* @author z_hh
* @date 2018年7月24日
*/
public class MiniTV {
Electricity110V electricity110v;
/**
* 需要110V的插座完成构造
* @param electricity110v
* @exception 参数为空时抛出NullPointerException
*/
public MiniTV(Electricity110V electricity110v) {
if (Objects.isNull(electricity110v)) {
throw new NullPointerException("需要220V的电流!");
}
this.electricity110v = electricity110v;
}
public void setElectricity110v(Electricity110V electricity110v) {
this.electricity110v = electricity110v;
}
/**
* 获得电流
* @return 电压
*/
int get110VElectricity() {
int electricit = electricity110v.discharge110VElectricit();
System.out.println("我是电视,获得了" + electricit + "V的电流!");
return electricit;
}
}
110V电压接口
/**
* 释放110伏特电流的接口
* @author z_hh
* @time 2018年7月24日
*/
public interface Electricity110V {
/**
* 释放110伏特的电流
* @return 电压
*/
int discharge110VElectricit();
}
220V的电池
/**
* 释放220伏特电流的电池
* @author z_hh
* @date 2018年7月24日
*/
public class Battery220V {
/**
* 释放220伏特的电流
* @return 电压
*/
int discharge220VElectricit() {
System.out.println("我是电池,释放了220V的电流!");
return 220;
}
}
电流适配器
/**
* 适配器,用释放220伏特电流的电池,降压为释放110伏特的电流
* @author z_hh
* @date 2018年7月24日
*/
public class ElectricitAdapter implements Electricity110V {
Battery220V battery = new Battery220V();
@Override
public int discharge110VElectricit() {
int electricit = battery.discharge220VElectricit();
System.out.println("原来的电压是" + electricit + "V。经过变压器之后,电压变为为110V");
return electricit - 110;
}
}
测试:
public class Test {
public static void main(String[] args) {
// 开始没有220V的电流
Electricity110V electricity110v = null;
// 执行时NullPointerException: 需要220V的插座!
// Plug plug = new Plug(socket110v);
// 使用适配器
electricity110v = new ElectricitAdapter();
MiniTV tv = new MiniTV(electricity110v);
tv.setElectricity110v(electricity110v);
// 再执行,完成电压适配
tv.get110VElectricity();
}
}
结果:
我是电池,释放了220V的电流!
原来的电压是220V。经过变压器之后,电压变为为110V
我是电视,获得了110V的电流!