假设我们现在有一个接口,我们希望它和一个新的类库搭配使用,但是这个新的类的接口又和旧的类库不一样;
如果现在不改变原有类和新类的情况下,我们可以写个类,将现有类的接口转化为新类的需要的接口。我们把这个类成为适配器类。
这个适配器类的作用就如同一个中间人,他将现有的资源转化为目标客户需要的东西。
适配器模式的定义
将一个类的接口转化为客户期望的另一个接口,适配器模式让原本接口不兼容的两个类可以进行合作无间。
类图
实例
我们现在根据电源适配器来分析适配器模式
首先我们定义已经存在的系统,定义一个电脑和电源。
/**
* 电源接口
*
* @author lixin
*/
public interface IPower {
/**
* 输出电源
*
* @return 返回电压
* @author "miaopasi"
*/
int outPower();
}
/**
* 电源实现类
*
* @author lixin
*/
public class Power implements IPower {
/**
* 直插电压
*
* @return 输出15V电压
*/
@Override
public int outPower() {
return 15;
}
}
/**
* 电脑接口
*
* @author lixin
*/
public interface IComputer {
/*** 额定电压 */
Integer RATED_V = 15;
/**
* 输入电源
*
* @param power 电源
* @throws IllegalArgumentException 电流电压参数异常
* @author "miaopasi"
*/
void inPower(IPower power) throws IllegalArgumentException;
/**
* 电脑状态
*
* @return false 未通电,true通电
*/
boolean status();
/**
* 初始化电脑
*
* @throws InterruptedException 初始化异常
* @author "miaopasi"
*/
void init() throws InterruptedException;
}
/**
* 电脑现实类
*
* @author lixin
*/
public class Computer implements IComputer {
/*** 通电状态 */
private Boolean status = Boolean.FALSE;
@Override
public void inPower(IPower power) throws IllegalArgumentException {
if (power.outPower() > RATED_V) {
throw new IllegalArgumentException("电源输入电压过高");
}
if (power.outPower() < RATED_V) {
throw new IllegalArgumentException("电源输入电压过低");
}
this.status = true;
}
@Override
public boolean status() {
return this.status;
}
@Override
public void init() throws InterruptedException {
System.out.println("初始化电脑中...");
Thread.sleep(2000);
System.out.println("初始化电脑完成...");
}
}
现在我们创建一个测试类
/**
* 测试能否开机
*
* @author lixin
*/
public class Demo {
public static void main(String[] args) throws InterruptedException {
// 创建一台电脑
IComputer computer = new Computer();
// 标准电压,可以直接给电脑使用
computer.inPower(new Power());
// 初始化电脑
computer.init();
// 查看状态,电压异常会抛出异常
System.out.println(computer.status());
}
}
// 输出
初始化电脑中...
初始化电脑完成...
true
现在用户提供了一个220V的电源,我们电脑不能使用它,我们需要一个电源适配器来吧220V电源转化为标准电压。
/**
* 新的电源接口
*
* @author lixin
*/
public interface IPower2 {
/**
* 输出电源
*
* @return 返回电压
* @author "miaopasi"
*/
long outPower();
}
/**
* 电源实现类
*
* @author lixin
*/
public class Power220V implements IPower2 {
/**
* 直插电压
*
* @return 输出220V电压
*/
@Override
public long outPower() {
return 220L;
}
}
/**
* 电脑电源适配器
*
* @author lixin
*/
public class PowerAdapter implements IPower {
/*** 需要适配的电源 */
private final IPower2 power;
public PowerAdapter(IPower2 power) {
this.power = power;
}
@Override
public int outPower() {
int normalPower;
System.out.println("计算机额定电压为:" + IComputer.RATED_V + "V");
System.out.println("电压输入电压为:" + this.power.outPower() + "V");
System.out.println("电压转换中...");
normalPower = this.conversionVoltage(power.outPower());
System.out.println("电压转换完成...");
return normalPower;
}
/**
* 把输入电压转化为额定电压
*
* @param in 输入电压
*/
private int conversionVoltage(long in) {
// 输入电压和额定电压一致的,不做如何操作
if (in == IComputer.RATED_V) {
System.out.println("电压正常,直接输出。");
} else if (in < IComputer.RATED_V) {
System.out.println("电压过低,电压:+" + (IComputer.RATED_V - in) + "V");
} else {
System.out.println("电压过高,电压:-" + (in - IComputer.RATED_V) + "V");
}
return IComputer.RATED_V;
}
}
/**
* 测试能否开机
*
* @author lixin
*/
public class Demo {
public static void main(String[] args) throws InterruptedException {
// 创建一台电脑
IComputer computer = new Computer();
// 电脑没法直接使用220V电源
// computer.inPower(new Power220V());
// 这时我们可以在中间插一个电源适配,把220V电压转化为电脑的标准电压15V
IPower power = new PowerAdapter(new Power220V());
computer.inPower(power);
// 初始化电脑
computer.init();
// 查看状态,电压异常会抛出异常
System.out.println(computer.status());
}
}
// 输出
计算机额定电压为:15V
电压输入电压为:220V
电压转换中...
电压过高,电压:-205V
电压转换完成...
初始化电脑中...
初始化电脑完成...
true