js设计模式【详解】—— 适配器模式

简介: js设计模式【详解】—— 适配器模式

适配器模式的定义

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

用途:将无法使用的接口转换成可以使用的接口

使用场景:库的适配、参数的适配、数据的适配

注意事项:适配器模式本质上是一个亡羊补牢的模式,它解决的是现存的两个接口之间不兼容的问题,不应该在软件的初期开发阶段就使用该模式;如果在设计之初就能够统筹的规划好接口的一致性,那么适配器就应该尽量减少使用。

适配器模式——库的适配

百度统计提供的埋点接口格式如下

_hmt.push(['_trackEvent', category, action, opt_label,opt_value]);

神策数据提供的埋点接口格式如下:

sa.track(eventName, {
  attrName: value 
})

现需将百度统计的_htm.push接口更改成为神策提供的sa.track接口,可以写一个适配器完成所有埋点事件的迁移:

//app.js
 
let _hmt = {
  push: (arr) {
    
    const [eventName, attrName, value] = [...arr.splice(2)];
    
    let attrObj = {
      [attrName]: value
    };
 
    sa.track(eventName, attrObj);
  }
}

分析比较百度统计的接口和神策的接口,可知在神策中只需要传入三个参数,eventName对应的是百度统计接口中的action, attrName对应的是百度统计接口中的opt_label, value对应的是百度统计接口中的opt_value; 删除了百度统计的SDK后,SDK所提供的_htm这个全局变量也就不存在了,可以利用该变量名做适配器,在push方法获取sa.track所需要的三个参数并调用sa.track即可。

适配器模式——参数的适配

例如在SDK这个类中有一个phoneStatus,需要传入五个参数用于接收手机的相关信息:

class SDK {
  phoneStatus(brand, os, carrier, language, network) {
 
    //dosomething.....
  }
}

在传入的参数大于3的时候,可以考虑将参数合并为一个对象的形式,下面我们将phoneStatus的参数接口定义如下(String代表参数类型,?: 代表可选项)

{
  brand: String
  os: String
  carrier:? String
  language:? String
  network:? String
}

carrierlanguagenetwork这三个属性不是必须传入的,在方法内部可能被设置一些默认值。所以这时可以在方法内部采用适配器来适配这个参数对象。

class SDK {
  phoneStatus(config) {
    
    let defaultConfig = {
      brand: null,  //手机品牌
      os: null, //系统类型: Andoird或 iOS
      carrier: 'china-mobile', //运营商,默认中国移动
      language: 'zh', //语言类型,默认中文
      network: 'wifi', //网络类型,默认wifi
    }
    
    //参数适配
    for( let i in config) {
      defaultConfig[i] = config[i] || defaultConfig[i];
    }
    
    //dosomething.....
  }
}

适配器模式——数据的适配

通常服务器端传递的数据和前端需要使用的数据格式不一致,这时需要对后端的数据格式进行适配。

例如后端返回的数据格式为:

[
  {
    "day": "周一",
    "uv": 6300
  },
  {
    "day": "周二",
    "uv": 7100
  },  {
    "day": "周三",
    "uv": 4300
  },  {
    "day": "周四",
    "uv": 3300
  },  {
    "day": "周五",
    "uv": 8300
  },  {
    "day": "周六",
    "uv": 9300
  }, {
    "day": "周日",
    "uv": 11300
  }
]

但Echarts需要的x轴的数据格式和坐标点的数据是:

["周二", "周二", "周三", "周四", "周五", "周六", "周日"] //x轴的数据
 
[6300. 7100, 4300, 3300, 8300, 9300, 11300] //坐标点的数据

这时就可以使用适配器,将后端的返回数据做适配:

//x轴适配器
function echartXAxisAdapter(res) {
  return res.map(item => item.day);
}
 
//坐标点适配器
function echartDataAdapter(res) {
  return res.map(item => item.uv);
}

更多设计模式详见——js设计模式【详解】总目录

https://blog.csdn.net/weixin_41192489/article/details/116154815

目录
相关文章
|
2天前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 职责链模式
js设计模式【详解】—— 职责链模式
21 8
|
2天前
|
设计模式 JavaScript Go
js设计模式【详解】—— 状态模式
js设计模式【详解】—— 状态模式
17 7
|
2天前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 组合模式
js设计模式【详解】—— 组合模式
20 7
|
2天前
|
设计模式 JavaScript
js设计模式【详解】—— 桥接模式
js设计模式【详解】—— 桥接模式
15 6
|
2天前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
14 6
|
2天前
|
设计模式 JavaScript 算法
js设计模式【详解】—— 模板方法模式
js设计模式【详解】—— 模板方法模式
17 6
|
2天前
|
设计模式 存储 JavaScript
js设计模式【详解】—— 享元模式
js设计模式【详解】—— 享元模式
16 6
|
JavaScript 前端开发 数据格式
JavaScript设计模式与实践--适配器模式
适配器模式(Adapter) 适配器模式主要用来解决两个已有接口之间不匹配的问题,它不考虑这些接口是怎样实现的,也不考虑它们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够使它们协同作用。
1184 0
|
7天前
|
XML 缓存 JavaScript
一篇文章讲明白JS模板引擎之JST模板
一篇文章讲明白JS模板引擎之JST模板
11 2
|
20天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的校园食堂订餐系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的校园食堂订餐系统附带文章源码部署视频讲解等
51 10