在学习和总结设计模式的过程中,确实有必要根据具体的编程语言来调整和理解这些模式。在javascript中,由于其基于原型的动态特性,设计模式的实现可能与传统的静态类型语言有所不同。以下是关于适配器模式的详细总结,按照您提出的“场景” – “设计模式定义” – “代码实现” – “更多场景” – “总”的顺序进行:
场景
在使用第三方库时,常常会遇到当前接口与第三方接口不匹配的情况。例如,使用一个Table组件,它要求返回的表格数据格式如下:
{ code: 0, // 业务 code msg: '', // 出错时候的提示 data: { total: , // 总数量 list: [], // 表格列表 }};
但后端返回的数据格式可能是这样的:
{ code: 0, // 业务 code message: '', // 出错时候的提示 data: { total: , // 总数量 records: [], // 表格列表 }};
此时,可以通过适配器模式进行数据格式的转换。
设计模式定义
维基百科对适配器模式的定义是:在不改变现有类的基础上,让它们能够正常使用另一个类。适配器模式在基于类的语言中有两种实现方式:
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
组合方式:适配器类内部包含原对象的实例。继承方式:适配器类直接继承原类。
以下是UML类图的示例:

左边的Adapter内部拥有Adaptee的实例,右边的Adapter类直接继承Adaptee类。适配器会将Adaptee的specificOperation方法进行相应的处理,包装为operation方法供client使用。
代码实现
在JavaScript中,我们可以使用函数来实现适配器模式。让我们用一个简单的例子来说明:现实生活中,iPhone有两种耳机插口,一种是Lightning,一种是传统的3.5毫米接口。如果是Lightning插口的耳机想要插到传统的3.5毫米接口的电脑上,就需要适配器。
首先,我们用Java来展示传统的适配器模式实现:
class Lightning耳机 { public void 插入Lighting接口() { System.out.println("插入到Lighting耳机接口成功"); }}class 传统耳机 {public void 插入到传统耳机孔() {System.out.println("插入到传统耳机孔成功");}}
class Lightning耳机到传统耳机适配器 extends 传统耳机 {public Lightning耳机 Lightning耳机;
public Lightning耳机到传统耳机适配器(Lightning耳机 耳机) { Lightning耳机 = 耳机;}public void 插入到传统耳机孔() { Lightning耳机.插入Lighting接口();}
}
class 电脑传统耳机孔 {public 传统耳机 耳机;
public 电脑传统耳机孔(传统耳机 传统耳机) { 耳机 = 传统耳机;}public void 插入耳机() { 耳机.插入到传统耳机孔();}
}
public class Main {public static void main(String[] args) {传统耳机 传统耳机 = new 传统耳机();电脑传统耳机孔 电脑传统耳机孔 = new 电脑传统耳机孔(传统耳机);电脑传统耳机孔.插入耳机(); // 插入到传统耳机孔成功
Lightning耳机 Lightning耳机 = new Lightning耳机(); 电脑传统耳机孔 电脑传统耳机孔2 = new 电脑传统耳机孔(new Lightning耳机到传统耳机适配器(Lightning耳机)); 电脑传统耳机孔2.插入耳机(); // 插入到Lighting耳机接口成功}
}
接下来,我们将其转换为JavaScript的实现:
const Lightning耳机 = {插入Lighting接口() {console.log("插入到Lighting耳机接口成功");}};const 传统耳机 = {插入到传统耳机孔() {console.log("插入到传统耳机孔成功");}};
const 电脑传统耳机孔 = {插入耳机(耳机) {耳机.插入到传统耳机孔();}};
const Lightning耳机到传统耳机适配器 = function(Lightning耳机) {return {插入到传统耳机孔() {Lightning耳机.插入Lighting接口();}};};
电脑传统耳机孔.插入耳机(传统耳机); // 插入到传统耳机孔成功电脑传统耳机孔.插入耳机(Lightning耳机到传统耳机适配器(Lightning耳机)); // 插入到Lighting耳机接口成功
回到开头的问题,Table组件提供了一个responseProcessor的钩子,我们可以通过这个钩子将接口返回的数据进行包装:
{...responseProcessor(res) {return {...res,msg: res.message, // 出错时候的提示data: {...res.data,list: res?.data?.records || [], // 表格列表}};},...}
更多场景
除了应对数据格式不一致的问题,适配器模式还可以为上层提供统一接口,解决兼容性问题。一个典型的例子是jQuery,它通过适配器模式来处理不同浏览器的兼容性问题。例如:
// Create the request object// (This is still attached to ajaxSettings for backward compatibility)jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?// Support: IE6-IE8function() {// XHR cannot access local files, always use ActiveX for that caseif (this.isLocal) {return createActiveXHR();}// Support: IE 9-11// IE seems to error on cross-domain PATCH requests when ActiveX XHR// is used. In IE 9+ always use the native XHR.// Note: this condition won't catch Edge as it doesn't define// document.documentMode but it also doesn't support ActiveX so it won't// reach this code.if (document.documentMode > 8) {return createStandardXHR();}// Support: IE} :createStandardXHR;
总
适配器模式是一种相对简单的设计模式,在JavaScript中可以通过函数进行转换。适配器模式和代理模式在代码结构上相似,但它们的意图不同:适配器模式是为了解决两个对象之间不匹配的问题,而代理模式是为了增强原对象的功能,提供的接口不会改变。
通过学习和总结适配器模式,我们可以更好地理解如何在JavaScript中应用设计模式,以解决实际开发中的问题。
以上就是前端的设计模式系列-适配器模式的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/9883.html
微信扫一扫
支付宝扫一扫