1、适配器模式:用一个适配器类将一个Source类的接口的返回结果转换为另一个Target类的接口可以接收的参数,达到两个接口的数据兼容的目的,比如说给手机充电,使用变压器将220V电压转换为5v电压,这里220V电压是Source类,5V是Target类,变压器就是适配器类
2、什么时候使用适配器模式?
(1)在Source类和Target类都不能更改,并且要使Source类返回的数据兼容Target类时,可以考虑使用适配器模式,一般在软件维护时会用到
(2)在最初开发时应该避免接口不兼容的问题,尽量不考虑使用适配器模式。只有在后期维护无法更改代码时才使用适配器模式进行适配。
(3)当调用第三方库,但是第三方库返回的数据不兼容我们的代码时考虑用适配器模式适配
3、以给手机充电为例实现适配器模式
// 生产电压的接口,用来输出电压
package 结构型模式.适配器模式;
/**
* @Author: lxpStu
* @Date: 2021/11/03/22:12
* @Description: 规定输出电压的接口
*/
public interface V {
/**
* 输出电压
* @return
*/
int outputV();
}
// 国产220V电压不可更改,手机想要充电只能使用变压器去适配
package 结构型模式.适配器模式;
/**
* @Author: lxpStu
* @Date: 2021/11/03/22:03
* @Description: 生产220V电压,假设该类代码不可以转变
*/
public class V220 implements V{
@Override
public int outputV() {
// 输出220V的电压
return 220;
}
}
// 定义一个变压器接口,用来规定转换电压的方法
package 结构型模式.适配器模式;
/**
* @Author: lxpStu
* @Date: 2021/11/03/22:03
* @Description: 电压适配器
*/
public interface Adaptor {
/**
* 转换电压
* @return 转换后的电压
*/
int exchange5V();
}
// 5V电压实现了输出电压接口V(用来输出5v电压),实现了适配器接口Adaptor(用来将220V转换为5v)
package 结构型模式.适配器模式;
/**
* @Author: lxpStu
* @Date: 2021/11/03/22:04
* @Description: 生产5V电压
*/
public class V5 implements Adaptor , V{
@Override
public int exchange5V() {
// 将220V电压转换为5V电压
V220 v220 = new V220();
int v = v220.outputV();
return v / 44;
}
@Override
public int outputV() {
// 输出5V的电压
return new V5().exchange5V();
}
}
// 手机类,用来模拟手机充电,由于手机早已存在,所以这个类的代码不能动
package 结构型模式.适配器模式;
/**
* @Author: lxpStu
* @Date: 2021/11/03/22:08
* @Description: 手机充电
*/
public class Phone {
/**
* 充电方法: 该类代码不可以更改
* @param v 一个电压
*/
public void charging(V v){
// 需要一个5V的电压
int dest = 5;
if(v.outputV() == dest){
System.out.println("电压是:"+ v.outputV() +"v, 可以充电");
}else{
System.out.println("电压是:"+ v.outputV() +",需要的是" + dest + "不可以充电");
}
}
}
// 测试类,测试手机能否充电
package 结构型模式.适配器模式;
/**
* @Author: lxpStu
* @Date: 2021/11/03/22:19
* @Description:
*/
public class Main {
public static void main(String[] args) {
Phone phone = new Phone();
V v5 = new V5();
phone.charging(v5);
}
}
// 输出:
// 电压是:5v, 可以充电
// Process finished with exit code 0
上述代码中220V的类和手机类Phone早已存在,不可更改,但是手机充电只能使用5V电压,所以定义一个5V的电压类:V5,实现适配器接口Adaptor中的电压转换方法:exchange(),将电压从220V转换为5V,又实现了电压接口V中的输出电压的方法:outputV()用来输出5v电压给手机充电。