定义
适配器模式(adapter),他的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。
类适配器
在我国,居民用电是220V交流电,手机锂电池使用5V直流电,我们这时候就需要电源适配器来进行转换,代码如下:
//220v交流电
public class AC220 {
public int outputAC220V(){
System.out.println("输出220v交流电");
return 220;
}
}
//5V直流电
public interface DC5 {
int output5V();
}
//电源适配器
public class PowerAdapter extends AC220 implements DC5{
@Override
public int output5V() {
int ac220V = outputAC220V();
int dc5 = ac220V/44;
System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
return dc5;
}
}
测试:
public static void main(String[] args) {
PowerAdapter powerAdapter = new PowerAdapter();
powerAdapter.output5V();
}
uml类图
对象适配器
对象适配器通过组合来实现适配器功能。针对与第一种,只需要修改Adapter
//电源适配器
public class PowerAdapter implements DC5 {
private AC220 ac220;
PowerAdapter(AC220 ac220) {
if(Objects.isNull(ac220))
throw new RuntimeException("AC220 null!!!");
this.ac220 = ac220;
}
@Override
public int output5V() {
int ac220V = ac220.outputAC220V();
int dc5 = ac220V/44;
System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
return dc5;
}
}
接口适配器
当适配器接口众多时候,如果直接实现接口,会出现很多方法,过于臃肿,我们可以使用抽象类实现接口,空实现接口的各种方法,然后让子类实现个别适配方法。
//220v交流电
public class AC220 {
public int outputAC220V(){
System.out.println("输出220v交流电");
return 220;
}
}
//直流电
public interface DC {
int output5V();
int output10V();
int output20V();
}
//电源适配器抽象实现
public abstract class PowerAdapter implements DC {
protected AC220 ac220;
PowerAdapter(AC220 ac220) {
if(Objects.isNull(ac220))
throw new RuntimeException("AC220 null!!!");
this.ac220 = ac220;
}
@Override
public int output5V() {
return 0;
}
@Override
public int output10V() {
return 0;
}
@Override
public int output20V() {
return 0;
}
}
//5V电源适配器(10V和20V省略)
public class Power5VAdapter extends PowerAdapter{
Power5VAdapter(AC220 ac220) {
super(ac220);
}
@Override
public int output5V() {
int ac220V = super.ac220.outputAC220V();
int dc5 = ac220V/44;
System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
return 0;
}
}
测试:
PowerAdapter powerAdapter = new Power5VAdapter(new AC220());
powerAdapter.output5V();
类图: