JavaScript 设计模式(四):适配者模式

栏目: 后端 · 发布时间: 5年前

内容简介:适配器模式:将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),使得原本由于接口不兼容而不能一起工作的那些类(对象)可以正常协作。简单理解就是为兼容而生的 “转换器”。对于强迫症患者,那么多形状各异的接口,对应着不同数据线。如果可以有一个转接口实现集合兼容,岂不美哉。没错,这样一个适配器,你值得拥有。(各大厂商加把劲。。。)

JavaScript 设计模式(四):适配者模式

适配器模式:将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),使得原本由于接口不兼容而不能一起工作的那些类(对象)可以正常协作。简单理解就是为兼容而生的 “转换器”。

对于强迫症患者,那么多形状各异的接口,对应着不同数据线。如果可以有一个转接口实现集合兼容,岂不美哉。没错,这样一个适配器,你值得拥有。(各大厂商加把劲。。。)

生活小栗子:

  1. 港式插头转换器
  2. 笔记本电源适配器
  3. Type-C 转接口

模式特点

  1. 新包装对象(适配器对象)实现对原对象接口的访问(接口名可不同)
  2. 适配器对象不对请求数据做预处理,直接传入原对象接口处理
  3. 适配器对象对外接口名统一,外部调用者可统一接口调用多对象方法

模式实现

实现方式:在不改变原有对象接口的基础上,定义一个包装对象,新对象转接调用原有接口,使外部调用者可以正常使用。

第三方SDK的应用

// 适配器实现地图SDK统一渲染
var googleMap = {
    show: function(){
        console.log('开始渲染谷歌地图');
    }
};
var baiduMap = {
    display: function(){
        console.log('开始渲染百度地图');
    }
};

// 外部实际调用的适配器对象
var baiduMapAdapter = {
    show: function() {
        return baiduMap.display();
    }
};

// 外部调用者
var renderMap = function(map) {
    map.show();   // 统一接口调用
};

renderMap(googleMap);
renderMap(baiduMapAdapter);

ES6实现适配器

// 使用ES6改写适配器实现地图SDK统一渲染
class googleMap {
  show() {
    console.log('开始渲染谷歌地图');
  }
}

class baiduMap {
  display() {
    console.log('开始渲染百度地图');
  }
}

class baiduMapAdapter extends baiduMap {
  constructor() {
    super();
  }

  show() {
    this.display();
  }
}

// 外部调用者
function renderMap(map) {
  map.show();   // 统一接口调用
}

renderMap(new googleMap());
renderMap(new baiduMapAdapter());

jQuery中的应用

适配器模式非常适用于跨浏览器兼容,例如强大的 jQuery 封装了事件处理的适配器,解决跨浏览器兼容性问题,极大简化我们日常编程操作。

// $('selector').on 的实现
function on(target, event, callback) {
    if (target.addEventListener) {
        // 标准事件监听
        target.addEventListener(event, callback);
    } else if (target.attachEvent) {
        // IE低版本事件监听
        target.attachEvent(event, callback)
    } else {
        // 低版本浏览器事件监听
        target[`on${event}`] = callback
    }
}

适用场景

  1. 跨浏览器兼容
  2. 整合第三方SDK
  3. 新老接口兼容

适配器模式的初衷是为了解决多对象(接口)兼容问题,如果存在多对象协同工作时,不方便直接修改原对象的基础上,可考虑用适配器封装,以便外部调用者统一使用。

与其它模式的异同

适配器模式不会改变原有接口,这一点与装饰者模式和代理模式类似。

VS 代理模式

适配器模式与代理模式最相似,同样都是创建一个新对象(包装一次),实现对本体的调用。

两者的区别:代理模式是为了管控原有对象(本体)的访问,代理的初衷并不是为兼容,并主张代理与本体对外接口保持一致。

而适配器则是为兼容而生的 “转换器”,并不预处理请求,直接将请求转接给原接口,新接口与原接口名可能不同。

“代理模式“(严父):学校缴费要一千块,这么多?

装饰者模式及外观模式,会在之后的篇章整理,这里稍作了解。

VS 装饰者模式

装饰者模式的作用是为对象添加功能,可添加多次,形成装饰链。而适配器只会对原有对象包装一次。

VS 外观模式

外观模式与适配器模式最大的区别,是定义了一个新的接口。

优缺点

  • 优点:兼容性,保证外部可统一接口调用
  • 缺点:额外对象的创建,非直接调用,存在一定的开销(且不像代理模式在某些功能点上可实现性能优化)。

参考文章

本文首发Github,期待Star!

https://github.com/ZengLingYong/blog

作者:以乐之名


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web容量规划的艺术

Web容量规划的艺术

阿尔斯帕瓦 / 叶飞、罗江华 / 机械工业出版社 / 2010-1 / 29.00元

《Web容量规划的艺术》由John Allspaw(F订ickr的工程运营经理)撰写,结合了他个人在F1ickr成长过程中的许多经历和很多其他产业中同行的洞察力。在衡量增长、预测趋势、成本效益等方面,他们的经验都会给你一些可靠并有效的指导。 网站的成功是以使用和增长来衡量的,而且网站类公司的成败(生死)是依赖于他们是否有能力来衡量决定他们的基础结构,从而适应不断增长的需求。作者通过自身实践给......一起来看看 《Web容量规划的艺术》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试