背景:买了一台电视机,电源插头是两相插孔的,但是家里只有三孔的插座。
下面请看代码:
三相插孔接口
public interface TriplePin {
//参数代表火线,零线,地线
public void electrify(int l,int n,int e);
}
两相插孔接口
public interface DualPin {
//没有地线
public void electrify(int l,int n);
}
电视机类
public class TV implements DualPin {
@Override
public void electrify(int l, int n) {
System.out.println("火线通电:"+l+",零线通电:"+n);
System.out.println("电视开机");
}
}
电视机实现了两相插孔接口,无法插入家里的三相插孔。
通用适配【对象适配】
用一个适配器做转换,适配器中嵌入一个两相插孔设备,然后在三相插头通电方法中,调用接入的两插设备,完成了三相转两相。
public class Adapter implements TriplePin {
private DualPin dualPinDevice;
//创建适配器时,把两插设备先接入进来
public Adapter(DualPin dualPinDevice){
this.dualPinDevice=dualPinDevice;
}
//
@Override
public void electrify(int l, int n, int e) {
//调用被适配器设备的两插通电方法,忽略地线参数e
dualPinDevice.electrify(l,n);
}
}
客户端Client
public class Client {
public static void main(String[] args) {
//构造两插电视机
DualPin dualPinDevice = new TV();
//用适配器打通两端
TriplePin triplePinDevice = new Adapter(dualPinDevice);
//调用三插通电标准
triplePinDevice.electrify(1,0,-1);
}
}
专属适配【类适配】
//电视机专属适配器类TVAdapter
public class TVAdapter extends TV implements TriplePin {
@Override
public void electrify(int l, int n, int e) {
super.electrify(l,n);
}
}
Client客户端
public class Client {
public static void main(String[] args) {
TriplePin tvAdapter = new TVAdapter();
tvAdapter.electrify(1,0,-1);
}
}
分析
类适配器是继承于电视机的子类,这种继承关系让它固化成一种专属适配器,造成了继承耦合,如果我们要适配其他的电器,就不得不再写其他的专属适配器,造成代码冗余,但是用起来确实更方便。
对象适配器结构介绍
- 目标接口:客户端要使用的目标接口标准,对应上面的三插接口TriplePin.
- 适配器:实现了目标接口,将被适配器的接口转换成目标接口。
- 被适配者:被适配者的接口标准目前不能兼容目标接口。
- 客户端:目标接口的使用者。