特点
适配器模式主要将已有的接口转化适配成客户需要使用的接口,针对代码后期补救措施,一般在代码设计之初不会采用,主要应用场景是兼容之前的接口。它属于结构型模式,主要实现方式为类适配(继承)和对象适配(组合)的方式。本文基于经典的充电器问题进行说明。
核心代码
提供电压接口(插座)
@Slf4j
public class Socket{
private int voltage = 220;
// 提供一个电压
public int support220(){
log.info("插座能提供电压: {}",voltage);
return this.voltage;
}
}
客户端需要的接口
public interface Voltage {
int support110();
}
类适配
ExtendAdapter
@Slf4j
public class ExtendAdapter extends Socket implements Voltage {
@Override
public int support110() {
int support110 = super.support220() / 2;
log.info("适配器提供电压: {}",support110);
return support110;
}
}
这个适配类继承Socket
,
测试代码
@Test
public void testExtendAdapter(){
ExtendAdapter extendAdapter = new ExtendAdapter();
extendAdapter.support110();
}
日志信息
2021-03-12 13:22:04.559 INFO 117312 --- [ main] org.example.adapter.core.Socket : 插座能提供电压: 220
2021-03-12 13:22:04.561 INFO 117312 --- [ main] o.example.adapter.extend.ExtendAdapter : 适配器提供电压: 110
对象适配
AssemblyAdapter
@Slf4j
public class AssemblyAdapter implements Voltage {
private Socket socket;
public AssemblyAdapter(Socket socket) {
this.socket = socket;
}
@Override
public int support110() {
int support110 = socket.support220() / 2;
log.info("适配器提供电压: {}",support110);
return support110;
}
}
测试
@Test
public void testAssemblyAdapter(){
// 插座只能提供的220的电压
Socket socket = new Socket();
// 接入适配后
AssemblyAdapter assemblyAdapter = new AssemblyAdapter(socket);
assemblyAdapter.support110();
}
日志信息
2021-03-12 13:23:45.361 INFO 118224 --- [ main] org.example.adapter.core.Socket : 插座能提供电压: 220
2021-03-12 13:23:45.363 INFO 118224 --- [ main] o.e.adapter.assembly.AssemblyAdapter : 适配器提供电压: 110