转载本文请联系Java极客技术公众号。今天我们就一起来聊聊超广角适配器模式的使用吧!1.引入适配器模式,顾名思义,就是将一个类的接口转换成客户想要的另一个接口,使接口不兼容的类可以协同工作,也称为包装器模式(Wrapper)。在适配器模式下,接口不兼容的问题通常是通过增加一个新的适配器类来解决的,让没有关系的类可以协同工作。从设计的角度来看,适配器模式涉及三个角色:适配器类:适配器类可以调用另一个接口实现接口转换;适配类:适配类定义了一个已有的接口,这个接口适配是必需的;客户角色:客户类提出使用特定类的请求;2.例子在java中,有两种适配器模式,类适配器和对象适配器,一起来看看吧!2.1、类适配方式首先,我们创建一个接口Phone,接口的实现类是HuaweiiPhone!publicinterfacePhone{voidproductPhone();}publicclassHuaweiPhoneimplementsPhone{@OverridepublicvoidproductPhone(){System.out.println("制作一个华为手机");}}再创建一个接口Player,如果Player的实现类要调用HuaweiiPhone中的productPhone方法,我们应该做什么?最简单的方法就是复制productPhone方法的逻辑,但是这种方法显然效率不高!可以创建一个适配器ExpensiveAdapter使其继承HuaweiiPhone来解决接口转换的问题,如下:System.out.println("用手机播放音乐");}}测试类如下:publicclassAdapterClient{publicstaticvoidmain(String[]args){ExpensiveAdapteradapter=newExpensiveAdapter();adapter.action();}}可以实现接口转换!但是这种方法也有很大的局限性。如果Phone接口的实现类有多少?我们知道一个类不能多重继承,对象适配模式就派上用场了!2.2.同样的对象适配方式,我们可以优化ExpensiveAdapter类,如下:publicclassExpensiveAdapterimplementsPlayer{privatePhonephone;publicExpensiveAdapter(Phonephone){this.phone=phone;}@Overridepublicvoidaction(){//调用Phone接口中的productPhone方法phone.productPhone();System.out.println("用手机播放音乐");}}测试客户端如下:publicclassPlayerClient{publicstaticvoidmain(String[]args){//ObjectAdaptationExpensiveAdapteradapter=newExpensiveAdapter(newHuaweiPhone());adapter.action();}}与类适配方式相比,有没有发现对象适配方式更加灵活~3.在jdk中,适配设计方式也被广泛使用。比如我们熟悉的io包,其中字节流转换为字符流,就是用到了适配器模式!其中,应用最广泛的是SpringA类中的ioc对象依赖,通过引入另一个B类对象,可以调用B类中的方法,从而实现方法的协同工作!4、总结了adapter模式,可以让任意两个不相关的Class一起运行,提高了类的复用;比如在非常流行的Mybatis-plus持久化框架中,里面的Service层就是典型的类适配模式。在Service层可以很方便的进行CRUD调用,开发者基本不需要写CRUD代码,大大提高了开发效率!但是如果在设计的时候使用了太多的适配器,那么整个系统就会很乱,很难从整体上掌握。比如明明是调用了另一个接口,调用了另一个接口却回调了自己,如果在一个系统中这种情况发生太多,无异于一场灾难。因此,在设计和使用时,应尽可能明确。接口名包含方法名,命名时定义要规范!五、参考1.菜鸟教程-Adapter模式2.简书-键盘上的KirinArm-浅谈Java适配器模式
