1、认识适配器模式
- 适配器的核心目的就是让原本不相关联的两件东西,变得兼容。
其实就是利用java语言的多态特性(继承、接口) , 将继承获取到的基类api , 根据业务需求适配到对应的接口api中,把原先不相关、不兼容的东西,变得兼容。 - 按写法可以分为 类适配 和 对象适配。
分别举例来看看:
类适配(继承方式):
/**
* @author jay
* @since 2021/01/25
* @description: 业务场景将小米电池适配到其他品牌手机,如华为手机
*/
public class PhoneElecAdaptor extends XIaoMiMobile implements HuaWeiBatteryChange {
@Override
public void batteryExchange() {
//由继承得来
xmbattery();
}
}
//小米手机
class XIaoMiMobile {
public void xmbattery(){
System.out.println("小米手机电池");
}
}
//华为电池转换器接口
interface HuaWeiBatteryChange {
void batteryExchange();
}
对象适配(组合方式):
/**
* @author jay
* @since 2021/01/25
* @description: 业务场景:用小米手机充电器给其他品牌手机充电,如华为手机
*/
public class MobileChargerAdaptor implements HuaWeiCharger{
//组合方式引入
XiaomiCharger xiaomiCharger;
public MobileChargerAdaptor(XiaomiCharger xiaomiCharger){
this.xiaomiCharger = xiaomiCharger;
}
@Override
public void chargingHW() {
xiaomiCharger.chargingXM();
}
//输出xm mobile is charging
public static void main(String[] args) {
MobileChargerAdaptor mm = new MobileChargerAdaptor(new XiaomiMobile());
mm.chargingHW();
}
}
//华为充电器
interface HuaWeiCharger{
void chargingHW();
}
//华为手机充电
class HuaWeiMobile implements HuaWeiCharger{
@Override
public void chargingHW() {
System.out.println("huawei mobile is charging");
}
}
//小米手机充电器
interface XiaomiCharger{
void chargingXM();
}
//小米手机充电
class XiaomiMobile implements XiaomiCharger{
@Override
public void chargingXM() {
System.out.println("xm mobile is charging");
}
}
2、优缺点分析
类适配方式:
优点
- 高扩展性和复用率:类适配器直接借助了继承,让程序变得灵活,让被继承的类的api复用率很高。
- 符合开闭原则,任意新建适配类,不用修改基类的代码。
缺点
- 单继承 也就是java语言本身继承的缺点 : 单继承结构。基类中的子类无法访问到。
ps:如果能做到这点就显得特别强大了。
对象适配(组合)方式:
- 优点 : 相对类适配继承方式,显然访问范围更广,通过对象可以访问类中的各个属性方法。也是面向接口编程的一个思想体现。
- 缺点 : 由于整个对象强引入,耦合度高。一旦类中方法修改,比较不好改。
3、使用场景
- 当前类的api不满足需要,又要用到这个类,就可以使用适配器模式,进行改造,变得兼容
- 想建立一个具有通用特点的类,将来可以到处重复使用。
4、开源框架中的案例
SpringMVC HTTP请求处理 :
DispatcherServlet -> init() -> initServletBean ->
initWebApplicationContext -》 onRefresh -》
initHandlerAdapters