前端的设计模式系列-适配器模式
发布时间 - 2025-07-21 00:00:00 点击率:次在学习和总结设计模式的过程中,确实有必要根据具体的编程语言来调整和理解这些模式。在javascript中,由于其基于原型的动态特性,设计模式的实现可能与传统的静态类型语言有所不同。以下是关于适配器模式的详细总结,按照您提出的“场景” - “设计模式定义” - “代码实现” - “更多场景” - “总”的顺序进行:
场景
在使用第三方库时,常常会遇到当前接
口与第三方接口不匹配的情况。例如,使用一个Table组件,它要求返回的表格数据格式如下:
{
code: 0, // 业务 code
msg: '', // 出错时候的提示
data: {
total: , // 总数量
list: [], // 表格列表
}
};但后端返回的数据格式可能是这样的:
{
code: 0, // 业务 code
message: '', // 出错时候的提示
data: {
total: , // 总数量
records: [], // 表格列表
}
};此时,可以通过适配器模式进行数据格式的转换。
设计模式定义
维基百科对适配器模式的定义是:在不改变现有类的基础上,让它们能够正常使用另一个类。适配器模式在基于类的语言中有两种实现方式:
- 组合方式:适配器类内部包含原对象的实例。
- 继承方式:适配器类直接继承原类。
以下是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-IE8
function() {
// XHR cannot access local files, always use ActiveX for that case
if (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中应用设计模式,以解决实际开发中的问题。
# linux
# 浏览器
# 电脑
# access
# iphone
# ai
# 变现
# Java
# JavaScript
# jquery
# Static
# String
# void
# 继承
# 接口
# class
# public
# 对象
# table
# uml
# 数据格式
# 我们可以
# 可以通过
# 第三方
# 是为了
# 不匹配
# 是一种
# 让我们
# 是这样
# 基础上
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
EditPlus中的正则表达式 实战(4)
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
浅谈Javascript中的Label语句
C++用Dijkstra(迪杰斯特拉)算法求最短路径
nodejs redis 发布订阅机制封装实现方法及实例代码
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
如何确保FTP站点访问权限与数据传输安全?
Laravel如何配置和使用缓存?(Redis代码示例)
三星网站视频制作教程下载,三星w23网页如何全屏?
Laravel如何创建自定义中间件?(Middleware代码示例)
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
简单实现jsp分页
Android滚轮选择时间控件使用详解
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
微信小程序 input输入框控件详解及实例(多种示例)
如何基于PHP生成高效IDC网络公司建站源码?
PHP 500报错的快速解决方法
济南网站建设制作公司,室内设计网站一般都有哪些功能?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
微信小程序 canvas开发实例及注意事项
三星、SK海力士获美批准:可向中国出口芯片制造设备
JavaScript如何实现错误处理_try...catch如何捕获异常?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
JavaScript Ajax实现异步通信
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
,怎么在广州志愿者网站注册?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何在阿里云香港服务器快速搭建网站?
微信小程序 scroll-view组件实现列表页实例代码
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
linux top下的 minerd 木马清除方法
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
详解vue.js组件化开发实践
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤

