java设计模式3:适配器模式(理解\优缺点\使用场景)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容