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

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

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

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

作者:以乐之名


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

查看所有标签

猜你喜欢:

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

Tagging

Tagging

Gene Smith / New Riders / 2007-12-27 / GBP 28.99

Tagging is fast becoming one of the primary ways people organize and manage digital information. Tagging complements traditional organizational tools like folders and search on users desktops as well ......一起来看看 《Tagging》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具