本文以手机充电为例介绍。适配器模式中涉及到如下三个角色:
(1)被适配者(Adaptee)
希望被改变的原有接口,通常无法修改源码;比如交流电,通常我们无法在电路上修改交流电的电压输出,除非你把房子拆了;
(2)目标接口(Target)
该角色是我们想要的接口;比如直流电,各种手机充电通常需要的是直流电,交流电无法直接充电,所以需要中间转换器,也就是适配器,将交流电转换成直流电;
(3)适配器(Adapter):
将Adaptee和Target接口组合到一起的类;
交流电AlterCurrent类代码如下:
/**
* Created by leboop on 2020/5/26.
* 交流电:无法修改电路(无法修改其源码)
*/
public class AlterCurrent {
// 电压
private String voltage = "220V交流电";
/**
* 向外输出220V交流电
*/
public void outAC() {
System.out.println("输出" + this.voltage);
}
}
outAC方法模拟交流电电流输出。现在手机需要5V的直流电才可以充电,此时手机直接使用交流电是无法充电的,我们需要如下的直流电DirectCurrent:
/**
* Created by leboop on 2020/5/26.
* 直流电
*/
public class DirectCurrent {
// 电压
private String voltage = "5V直流电";
public void outDC() {
System.out.println("输出" + this.voltage);
}
}
直流电可以输出5V电压供手机充电。现在我们一个转换器将交流电转化成直流电,如下:
/**
* Created by leboop on 2020/5/26.
* 适配器:通过组合的方式实现
*/
public class CurrentAdapter extends DirectCurrent {
private AlterCurrent alterCurrent;
public CurrentAdapter() {
}
public CurrentAdapter(AlterCurrent alterCurrent) {
this.alterCurrent = alterCurrent;
}
@Override
public void outDC() {
if (alterCurrent != null) {
// 交流电输出
alterCurrent.outAC();
// 交流电转换直流电
System.out.println("交流电转化为直流电");
// 直流电输出
super.outDC();
} else {
System.out.println("充电器未连接交流电,无法输出电流");
}
}
}
适配器CurrentAdapter继承自直流电DirectCurrent,表示将充电器具备直流电的特征(从它流出的就是直流电)。适配器CurrentAdapter还通过组合的方式使用了交流电对象alterCurrent,表示充电器拥有交流电后才可以转换成直流电。现在我们在客户端模拟手机充电过程:
/**
* Created by leboop on 2020/5/25.
*/
public class AdapterMain {
public static void main(String[] args) {
// 现在提供交流电
AlterCurrent alterCurrent = new AlterCurrent();
// 经过充电器交流电变为直流电
DirectCurrent directCurrent = new CurrentAdapter(alterCurrent);
// 输出直流电
directCurrent.outDC();
// 手机未插充电器
Phone phone = new Phone();
phone.charging();
// 手机插上充电器
phone.setDirectCurrent(directCurrent);
phone.charging();
}
}
class Phone {
private DirectCurrent directCurrent;
public Phone() {
}
public Phone(DirectCurrent directCurrent) {
this.directCurrent = directCurrent;
}
public void charging() {
if (directCurrent != null) {
System.out.println("手机已经插上充电器,正在充电……");
} else {
System.out.println("手机还未插入充电器,不在充电,请插上充电器");
}
}
public DirectCurrent getDirectCurrent() {
return directCurrent;
}
public void setDirectCurrent(DirectCurrent directCurrent) {
this.directCurrent = directCurrent;
}
}
程序输出结果如下:
输出220V交流电
交流电转化为直流电
输出5V直流电
手机还未插入充电器,不在充电,请插上充电器
手机已经插上充电器,正在充电……
本文使用的全部都是类,实际中很多是接口,但思想是一样的,将其修改为对应的接口即可。