适配器模式

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15

适配器模式(Adapter):将一个类(对象)的接口(方法或者属性)转化成另外一个接口,以满足用户的需求,使类(对象)之间接口的不兼容问题通过适配器得以解决。

在日常生活中,主机链接显示器时,常因接口不同,需要额外一个适配器,比如(USB转HDMI)。而在代码层面,其实就是为两份代码所写的代码兼容运行而书写的额外代码。

参数适配器

function do(name, title, age, color, size, price) {
  // do something
}

// 而记住参数的顺序是很困难的,所以经常使用参数对象方式传入
// 在调用时又无法知道传递的参数是否完整,如有一些必需传入的参数没有传入,一些参数是有默认值来适配传入的这个参数对象
function do(obj) {
  var _adapter = {
    name: 'jack',
    title: 'adapter',
    age: 18,
    color: 'red',
    size: 100,
    price: 50
  }

  for (var key in _adapter) {
    _adapter[key] = obj[key] || _adapter[key];
  }

  // do something
}

数据适配

var arr = ['JavaScript', 'book', '前端编程语言', '20210801'];
// 该数组中的每个成员代表的意义不同,所以这种数据结构的语义不好
// 所以我们通常会将其适配成对象

function adapter(arr) {
  const [name, type, title, time] = arr;
  return { name, type, title, time };
}

最重要的是这种模式可以解决前后端的数据依赖,前端程序不再为后端所传输的数据所束缚,如果后端因为架构改变导致传递的数据结构发生变化,我们只需要写个适配器就可以了。

传统设计模式中,适配器模式往往适配两个类接口不兼容的问题,然而在JavaScript中,适配器的应用范围更广,比如适配两个代码库,适配前后端数据等。

不同于外观模式,外观模式的“参与者”往往只有“系统”和“客户”,而适配器的“参与者”往往有三个,“客户”、“适配器”、“系统”,常应用在“客户”和“系统”都不便做出更改时但又不能直接“通信”时,使用适配器模式。

比如,客户上传图片时不会在意图片的文件格式,而系统接口只接受png的格式,这时候就需要适配器来将其他任意的图片类型(jpg/jpeg等)适配为png传递给系统接口。