定义:将一个类的接口,转换成客户期望的另外一个接口。适配器让两个原本不兼容的接口可以合作无间。
优点:
- 可以让任何两个没有关联的类一起运行
- 提高了类的复用,想使用现有的类,而此类的接口标准又不符合现有系统的需要。通过适配器模式就可以让这些功能得到更好的复用。
- 增加了类的透明度,客户端只关注结果
- 使用适配器的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
缺点:
- 过多使用会导致系统凌乱,追溯困难(内部转发导致,调用A适配成B)
场景:
- 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
- 想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
实际案例:
假设我们先使用moto扫描头是设备,他们扫描接口如下:
//扫描头产品接口
public interface IScanHardwareMOTO {
public String getBarcodeData();
}
public class MOTO implements IScanHardwareMOTO{
@Override
public String getBarcodeData() {
//获取MOTO扫码后的条码数据
return null;
}
}
现在我们使用了一段时间之后发现moto扫描头不好用,我们想替换成霍尼的扫描头而且接口不能改变,那么这个时候适配器就启作用了:
1.定义适配器类继承moto扫描头接口,实际函数里面的实现调用霍尼提供的接口函数。
public class AdapterMOTO implements IScanHardwareMOTO {
IScanHardwareHoneywell hardwareHoneywell;
public AdapterMOTO(IScanHardwareHoneywell hardwareHoneywell) {
this.hardwareHoneywell = hardwareHoneywell;
}
@Override
public String getBarcodeData() {
return hardwareHoneywell.scanResult();
}
}
霍尼扫描头接口如下:
//霍尼扫描头产品接口
public interface IScanHardwareHoneywell {
public String scanResult();
}
public class Honeywell implements IScanHardwareHoneywell {
@Override
public String scanResult() {
//获取霍尼扫描的条码数据
return null;
}
}
测试:
public class Test {
public void main(){
IScanHardwareMOTO ScanHardwareMOTO=null;
String model = android.os.Build.DISPLAY.toUpperCase();//获取机型
if(model.equals("M710")){
//M710 的设备使用了moto的扫描头,我们得到moto扫描头的实例
ScanHardwareMOTO=new MOTO();
}else if(model.equals("H900")){
//H900 的设备使用了霍尼的扫描头,我们得到霍尼扫描头的实例
IScanHardwareHoneywell honeywell=new Honeywell();
//通过适配类来适配霍尼扫描头
ScanHardwareMOTO=new AdapterMOTO(honeywell);
}
if(ScanHardwareMOTO!=null){
String barcode=ScanHardwareMOTO.getBarcodeData();
Log.e("ScanBarcodeTest",barcode);
}
}
}