适配器模式:将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),使得原本由于接口不兼容而不能一起工作的那些类(对象)可以正常协作。简单理解就是为兼容而生的 “转换器”。
对于强迫症患者,那么多形状各异的接口,对应着不同数据线。如果可以有一个转接口实现集合兼容,岂不美哉。没错,这样一个适配器,你值得拥有。(各大厂商加把劲。。。)
生活小栗子:
- 港式插头转换器
- 笔记本电源适配器
- Type-C 转接口
模式特点
- 新包装对象(适配器对象)实现对原对象接口的访问(接口名可不同)
- 适配器对象不对请求数据做预处理,直接传入原对象接口处理
- 适配器对象对外接口名统一,外部调用者可统一接口调用多对象方法
模式实现
实现方式:在不改变原有对象接口的基础上,定义一个包装对象,新对象转接调用原有接口,使外部调用者可以正常使用。
第三方SDK的应用
|
|
ES6实现适配器
|
|
jQuery中的应用
适配器模式非常适用于跨浏览器兼容,例如强大的 jQuery 封装了事件处理的适配器,解决跨浏览器兼容性问题,极大简化我们日常编程操作。
|
|
适用场景
- 跨浏览器兼容
- 整合第三方SDK
- 新老接口兼容
适配器模式的初衷是为了解决多对象(接口)兼容问题,如果存在多对象协同工作时,不方便直接修改原对象的基础上,可考虑用适配器封装,以便外部调用者统一使用。
与其它模式的异同
适配器模式不会改变原有接口,这一点与装饰者模式和代理模式类似。
VS 代理模式
适配器模式与代理模式最相似,同样都是创建一个新对象(包装一次),实现对本体的调用。
两者的区别:代理模式是为了管控原有对象(本体)的访问,代理的初衷并不是为兼容,并主张代理与本体对外接口保持一致。
而适配器则是为兼容而生的 “转换器”,并不预处理请求,直接将请求转接给原接口,新接口与原接口名可能不同。
“代理模式“(严父):学校缴费要一千块,这么多?
“适配器模式” (慈母):学校缴费要一千块,给给给。
装饰者模式及外观模式,会在之后的篇章整理,这里稍作了解。
VS 装饰者模式
装饰者模式的作用是为对象添加功能,可添加多次,形成装饰链。而适配器只会对原有对象包装一次。
VS 外观模式
外观模式与适配器模式最大的区别,是定义了一个新的接口。
优缺点
- 优点:兼容性,保证外部可统一接口调用
- 缺点:额外对象的创建,非直接调用,存在一定的开销(且不像代理模式在某些功能点上可实现性能优化)。
参考文章
本文首发Github,期待Star!
https://github.com/ZengLingYong/blog
作者:以乐之名
本文原创,有不当的地方欢迎指出。转载请指明出处。