适配器模式:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作;简单来说就是适配,具体到日常生活就好比是手机充电,充电器就相当于是适配器,将插座的220V电压转化成手机需要的5V电压。
适配器的三种使用方式:类适配、对象适配、接口适配。
代码模拟三种适配方式(场景:执行统一充电方法给安卓手机充电):
充电统一接口:
public interface MobileCharge {
// 充电统一方法
public void charging();
}
安卓手机充电类(被适配对象):
public class AndroidChargingAdaptee {
// 安卓手机充电
public void androidCharging(){
System.out.println("安卓手机充电");
}
}
类适配方式实现:
public class MobileChargingClassAdapter extends AndroidChargingAdaptee implements MobileCharge {
// 实现统一充电接口;
@Override
public void charging() {
// 继承安卓手机充电方法,实现统一充电接口下面的安卓手机充电
this.androidCharging();
}
public static void main(String[] args) {
MobileCharge mobileCharge= new MobileChargingClassAdapter();
// 实现统一公共充电接口,实现类中执行继承自安卓手机充电类的安卓充电方法,执行安卓充电逻辑
mobileCharge.charging(); // 输出:安卓手机充电
}
}
对象适配:
public class MobileChargingTargetAdapter implements MobileCharge {
private AndroidChargingAdaptee androidChargingAdaptee;
public MobileChargingTargetAdapter(AndroidChargingAdaptee androidChargingAdaptee) {
this.androidChargingAdaptee = androidChargingAdaptee;
}
// 实现安卓手机统一公共充电方法,实现方法中执行安卓手机充电类的安卓充电方法,执行安卓充电逻辑
@Override
public void charging() {
this.androidChargingAdaptee.androidCharging();
}
public static void main(String[] args) {
MobileCharge mobileCharge = new MobileChargingTargetAdapter(new AndroidChargingAdaptee());
mobileCharge.charging();
}
}
接口适配
场景说明:统一接口中有多个方法时,按照上面的两种方式适配器需要实现统一接口中所有的方法,显然没有必要实现所有接口方法,根据实际需求实现指定方法才是最适合的;也就是问题转化成:实现一个接口,如何不实现该接口的所有方法,只对有需要的接口方法进行实现,此时可以考虑抽象类实现接口对所有接口方法并对所有方法做空实现,继承抽象类就能对指定方法进行重写;
模拟场景:统一充电的插座支持两孔、三孔充电,只希望实现其中的两孔充电。
统一充电接口:
public interface MobileCharge {
// 充电统一方法
// 两孔充电
public void twoHoleCharging();
// 三孔充电
public void threeHoleCharging();
}
抽象类对统一充电接口作空实现
public abstract class MobileChargeImp implements MobileCharge {
// 两孔充电
@Override
public void twoHoleCharging() {
}
// 三孔充电
@Override
public void threeHoleCharging() {
}
}
接口适配+对象适配的方式实现需求:
public class MobileChargingInterfaceAdapter extends MobileChargeImp {
private AndroidChargingAdaptee androidChargingAdaptee;
public MobileChargingInterfaceAdapter(AndroidChargingAdaptee androidChargingAdaptee) {
this.androidChargingAdaptee = androidChargingAdaptee;
}
// 实现统一充电接口;
// 两孔插座实现逻辑
@Override
public void twoHoleCharging() {
this.androidChargingAdaptee.androidCharging();
}
public static void main(String[] args) {
MobileCharge mobileCharge= new MobileChargingInterfaceAdapter(new AndroidChargingAdaptee());
// 实现统一公共充电接口,实现类中执行继承自安卓手机充电类的安卓充电方法,执行安卓充电逻辑
mobileCharge.twoHoleCharging(); // 输出:安卓手机充电
}
}