js中的设计模式之适配器模式

article/2025/10/25 16:02:15

Js中的适配器模式

定义

将一个对象的接口适配成用户所期待的接口。

详细描述

适配器模式就是将不同对象的方法适配成可以对接或者统一调用的方式。它也是包装器的一种。

在生活中也有很多类似的例子,比如有的手机没有3.5耳机插口,所以就需要增加一个转接头来完成适配功能以确保耳机的正常使用,如下图:
在这里插入图片描述
在我们平时开发中如果是我们自己定义的方法那么直接修改原方法来方便现在的调用即可,但是有很多时候我们都是使用第三方暴露的api,这个时候就没办法直接对原方法进行修改,所以我们就需要增加一个适配方法来让他们更加丝滑的调用。

代码实例

适配对象

我们在开发中做一些地图渲染的工作,因为某些原因需要使用谷歌地图和百度地图的api同时进行渲染,如果他们暴露出的api一致的话就可以使用统一的调用方法同时调用如:

    const googleMap = {render() {console.log('开始渲染谷歌地图');},};const baiduMap = {render() {console.log('开始渲染百度地图');},};const renderMap = (objData) => {Object.values(objData).forEach(({ render }) => {if (typeof render === 'function') render();});};// 开始渲染renderMap({ googleMap, baiduMap });// 开始渲染谷歌地图// 开始渲染百度地图

上述代码因为谷歌和百度地图渲染api一致所以可以同时进行渲染,加入此时我的业务场景还需要使用高德地图来同时渲染(或者谷歌地图暴露的api改变),此时我们不想单独进行判断调用,就可以添加适配器来实现如:

    const googleMap = {render() {console.log('开始渲染谷歌地图');},};const baiduMap = {render() {console.log('开始渲染百度地图');},};const gaodeMap = {show() {console.log('开始渲染高德地图');},};// 定义适配对象const gaodeMapAdapter = {render() {gaodeMap.show();},};// api统一调用const renderMap = (objData) => {Object.values(objData).forEach(({ render }) => {if (typeof render === 'function') render();});};// 开始渲染renderMap({ googleMap, baiduMap, gaodeMapAdapter });// 开始渲染谷歌地图// 开始渲染百度地图// 开始渲染高德地图

上述代码就是定义了适配器对象,使新增加的高德地图的api也能和其他地图api一样融洽的调用。

适配函数
有时候我们在处理数据的时候或者后端新老接口更换,数据结构可能会和之前使用的不一样,然而我们项目中使用了很多以前的老数据结构,这时如果想让项目继续平稳运行要不就把使用老数据结构的地方全部修改但是这可能是一项很大的工程,还可以使用适配器函数来完成数据的转换来确保正常使用,如:

    // 老数据结构const oldData = {key1: 1111,key2: 2222,key3: 3333,};// 新数据结构const newData = [{key: 'key4',value: 4444,},{key: 'key5',value: 5555,},];// 统一使用函数const useData = (data) => {Object.entries(data).forEach(([key, value]) => {console.log(`使用数据${key} -- ${value}`);});};// 适配器函数const newDataAdapter = (oldData) => {return newData.reduce((preData, { key, value }) => {preData[key] = value;return preData;}, oldData);};useData(newDataAdapter(oldData));// 打印// 使用数据key1 -- 1111// 使用数据key2 -- 2222// 使用数据key3 -- 3333// 使用数据key4 -- 4444// 使用数据key5 – 5555

上述代码中之前使用的数据结构是对象结构,后来换成了数组结构,这时我们定义了一个适配函数newDataAdapter 值需要在老数据传入的地方调用一下就可以完成新老数据之间的适配,不需要把项目中每个使用的地方都修改一遍。

总结

适配器模式在js中是一种相对简单的模式,但是在我们平时开发和维护项目时使用的地方特别的广泛它可以使我们更加方便的维护和兼容不同的接口调用。它在结构上和一些其他包装模式非常相似如:装饰者模式、代理模式和外观模式等,都是使用一个对象包裹另外一个对象。区别他们的主要是使用意图:

  • 适配器模式主要用来解决两个已有接口之间不匹配的问题,它不考虑这些接口是怎样实 现的,也不考虑它们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够 使它们协同作用。
  • 装饰者模式和代理模式也不会改变原有对象的接口,但装饰者模式的作用是为了给对象 增加功能。装饰者模式常常形成一条长的装饰链,而适配器模式通常只包装一次。代理 模式是为了控制对对象的访问,通常也只包装一次。
  • 外观模式的作用倒是和适配器比较相似,有人把外观模式看成一组对象的适配器,但外 观模式最显著的特点是定义了一个新的接口。

http://chatgpt.dhexx.cn/article/BE1V9Qu1.shtml

相关文章

JavaScript设计模式之状态模式

什么是状态模式? 状态模式是一种非同寻常的优秀模式,它也许是解决某些需求场景的最好方法。虽然状态模式并不是一种简单到一目了然的模式(它往往还会带来代码量的增加),但你一旦明白了状态模式的精髓,以后…

【JavaScript设计模式】观察者模式

观察者模式 文章目录 观察者模式🌰:理解观察者模式手写观察者模式必须先订阅再发布吗Vue数据双向绑定(响应式系统)的实现原理实现一个Event Bus/ Event Emitter在Vue中使用Event Bus来实现组件间的通讯 观察者模式与发布-订阅模式…

js设计模式

js设计模式 1.构造器函数 function Ema(name, age) {this.name nameconsole.log(this);//谁调用了this就指向谁this.sayfunction(){console.log(1)}}let ema1new Ema(zhangsna1)let ema2new Ema(李四1)console.log(ema1);//Ema obj {name:zhangsan1, Fun say}console.log(ema…

八大最常用的JavaScript设计模式

八大最常用的JavaScript设计模式 设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目…

JavaScript 设计模式之组合模式

引 我们知道地球和一些其他行星围绕着太阳旋转,也知道在一个原子中,有许多电子围绕着原子核旋转。我曾经想象,我们的太阳系也许是一个更大世界里的一个原子,地球只是围绕着太阳原子的一个电子。而我身上的每个原子又是一个星系&a…

JavaScript设计模式

JavaScript设计模式 设计模式:代码经验的总结,是可重用的用于解决软件设计中一般问题的方案。 设计模式都是面向对象的。 学习设计模式,有助于写出可复用和可维护性高的程序。 常用的12种设计模式: 工厂模式 单例模式 原型模…

JavaScript中常见的十五种设计模式

一、单例模式 二、策略模式 三、代理模式 四、迭代器模式 五、发布—订阅模式 六、命令模式 七、组合模式 八、模板方法模式 九、享元模式 十、职责链模式 十一、中介者模式 十二、装饰者模式 十三、状态模式 十四、适配器模式 十五、外观模式 一、单例模式 1. …

JS 常用的六种设计模式介绍

常用设计模式 前言 我们经常听到一句话,“写代码要有良好的封装,要高内聚,低耦合”。究竟怎样的代码才算得上是良好的代码。 什么是高内聚,低耦合? 即五大基本原则(SOLID)的简写 高层模块不…

git工具统计项目的代码行数

1、git 查看代码的项目总行数 (1)打开Git终端,进入项目的根目录 git log --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add,…

小技巧之统计代码行数

欢迎关注我的微信公众号“人小路远”哦,在这里我将会记录自己日常学习的点滴收获与大家分享,以后也可能会定期记录一下自己在外读博的所见所闻,希望大家喜欢,感谢支持! 搞了两个月,连搬带抄写出来的代码&a…

MAC代码下统计代码行数工具

作为一名程序员在很多的时候需要统计代码行数: 支持windows系统的代码行数统计方法以及软件很多,但是MAC系统的统计代码行数的真的不太多。 大家都知道用 wc -l 命令进行代码行数统计,但是它会将代码中的注释、空行所占用的文本行都统计在内…

cloc工具 命令行 统计代码行数

基本用法 :cloc后面跟目录名,文件名,或压缩文件名 例如: cloc ./application 1.安装(参考官网http://cloc.sourceforge.net/#apt-get) 根据操作系统不同,选择以下任意安装方法 sudo npm install -g cloc …

程序代码行数统计

程序写完了,提交著作权的时候不知道代码行数是多少怎么办? 介绍 软件名称兼容系统下载地址代码统计工具Windows软件下载 下面我们开始教程 打开主应用程序点击加号添加程序项目所在的目录点击按钮选择需要统计文件的文件后缀,看个人需求如…

计代码行数cloc,一个代码统计行数很好用的工具

分为window、mac系统区分,基本是一样的,一个代码统计行数很好用的工具。 CLOC简介 Cloc是一款使用Perl语言开发的开源代码统计工具,支持多平台使用、多语言识别,能够计算指定目标文件或文件夹中的文件数(files&#x…

统计代码量-代码统计工具 CLOC | gitlab统计代码量

文章目录 一、代码统计工具 CLOC什么是CLOC?下载安装clocs使用 二、gitlab统计代码量命令行统计图形化统计IDE Statistic统计代码插件 一、代码统计工具 CLOC 什么是CLOC? github: https://github.com/AlDanial/cloc CLOC是Count Lines of Code的意思,可以计算…

Python实现一个代码行数统计工具(以C/C++为例)

前几天在网上看到一个有意思的题,题目是设计一个代码行数统计工具。这类工具我经常会用到,但是具体是如何实现的呢?这个问题我还从未思考过,于是便试着做出这种工具。 题目描述是这样的: 题目要求:   请…

统计项目代码行数工具cloc

Ubuntu用户 使用cloc在ubuntu内统计代码行数 安装cloc工具 sudo apt-get install cloc进入需要统计的目录内,然后执行 cloc .然后就会显示文件目录中的文件数(files)、空白行数(blank)、注释行数(comment)和代码行数(code)。 Windows 用户 也是使用cloc工具 …

Win10 代码行数统计工具CLOC的安装和使用

简介 CLOC(Count Lines of Code),是一个可以统计多种编程语言中空行、评论行和物理行的工具。这个工具还是蛮实用的,可以帮我们快速了解一个项目中代码的信息。 注:底下这个命令可以实现统计代码行数的功能,只是不排除空行和注释…

代码行数统计小工具

一、先下载好SourceCounter小工具。解压,然后直接打开文件夹中的SourceCounter.exe。如果没有找到此工具的下载链接,点这里下载 二、选择代码类型,勾选上所有类型 三、双击点开后,选择文件夹,就可以直接统计出字…

在项目开发中统计代码行数的6种方式

文章目录 一、使用find和wc命令统计代码行数进行参数的过滤筛选命令参数简要说明 二、PowerShell工具统计代码行数条件过滤输出所有文件的行数PowerShell相关命令的简要说明 三、git命令git ls-filesgit log 四、代码编辑器插件五、jscpd六、自己实现一个注释和空行忽略目录和文…