详解JavaScript实现设计模式中的适配器模式的方法


Posted in Javascript onMay 18, 2016

有的时候在开发过程中,我们会发现,客户端需要的接口和提供的接口发生不兼容的问题。由于特殊的原因我们无法修改客户端接口。在这种情况下,我们需要适配现有接口和不兼容的类,这就要提到适配器模式。通过适配器,我们可以在不用修改旧代码的情况下也能使用它们,这就是适配器的能力。
适配模式可用来在现有接口和不兼容的类之间进行适配,使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象。
从表面上看,适配器模式很像外观模式。它们都要对别的对象进行包装并改变其呈现的接口。二者的差别在于它们如何改变接口。外观元素展现的是一个简化的接口,它并不提供额外的选择,而且有时为了方便完成常见任务它还会做出一些假定。而适配器则要把一个接口转换为另一个接口,它并不会滤除某些能力,也不会简化接口。如果客户系统API不可用,就需要用到适配器。

基本理论

适配器模式:将一个接口转换成客户端需要的接口而不需要去修改客户端代码,使得不兼容的代码可以一起工作。

适配器主要有3个角色组成:
(1)客户端:调用接口的类
(2)适配器:用来连接客户端接口和提供服务的接口的类
(3)适配者:提供服务,但是却与客户端接口需求不兼容服务类。

适配器模式的实现

1.最简单的适配器

适配器模式没有想象中的那么复杂,举个最简单的例子。
客户端调用一个方法进行加法计算:

var result = add(1,2);

但是我们没有提供add这个方法,提供了同样类似功能的sum方法:

function sum(v1,v2){
  return v1 + v2;
}

为了避免修改客户端和服务端,我们增加一个包装函数:

function add (v1,v2){
  reutrn sum(v1,v2);
}

这就是一个最简单的适配器模式,我们在两个不兼容的接口之间添加一个包装方法,用这个方法来连接二者使其共同工作。

2.实际应用

随着前端框架的发展,越来越多的开发者开始使用MVVM框架进行开发,只需要操作数据而不需要操作DOM元素,jQuery的作用越来越少。而很多项目中还是引用着jQuery库作用工具类,因为我们要利用jQuery提供的ajax去服务器请求数据。如果jQuery在项目中的作用仅仅是作为ajax工具库的话,有点杀鸡焉用牛刀的感觉,造成资源浪费。这个时候我们完全可以封装一个自己的ajax库。
假设我们封装的ajax就通过一个函数进行使用:

ajax({
  url:'/getData',
  type:'Post',
  dataType:'json',
  data:{
    id:"123"
  }
})
.done(function(){})

除了调用接口ajax与jQuery的$.ajax的不同,其他完全一样。
项目中请求ajax的地方必然很多,我们替换jQuery的时候不可能一个一个去修改$.ajax,那怎么办呢,这个时候,我们就可以增加一个适配器:

var $ = {
  ajax:function (options){
    return ajax(options);
  }
}

这样就能兼容旧代码和新接口,避免对已有的代码的修改。

总结

适配器模式的原理很简单,就是新增一个包装类,对新的接口进行包装以适应旧代码的调用,避免修改接口和调用代码。
适用场景:存在较多代码调用旧接口,为了避免修改旧代码和更换新接口,不影响现有实现方式的应用场景。

1.适配器模式的适用场合:
适配器适用于客户系统期待的接口与现有API提供的接口不兼容这种场合。适配器所适配的两个方法执行的应该是类似的任务,否则的话就解决不了问题。就像桥接元素和外观元素一样,通过创建适配器,可以把抽象与其实现隔离开来,以便二者独立变化。

2.适配器模式之利:
用一个新的接口对现有类的接口进行包装,这样客户程序就能使用这个并非为其量身打造的类而又无需为此大动手术。

3.设配器模式之弊:
有人认为适配器是一种不必要的开销,完全可以通过重写现有代码避免。此外适配器模式也会引入一批需要支持的新工具。如果现有API还未定形,或者新接口还未定形,那么适配器可能不会一直管用。
在涉及大型系统和遗留框架的情况下,它的优点往往比缺点更突出。

Javascript 相关文章推荐
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
javascript document.compatMode兼容性
Feb 23 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
May 19 Javascript
Jquery操作radio的简单实例
Jan 06 Javascript
js兼容火狐获取图片宽和高的方法
May 21 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
Mar 07 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
Nov 09 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
Nov 10 Javascript
JS中Swiper的使用和轮播图效果
Aug 11 Javascript
12条写出高质量JS代码的方法
Jan 07 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 jQuery
js删除指定位置超链接中含有百度与360的标题
Jan 06 Javascript
深入剖析javascript中的exec与match方法
May 18 #Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
May 18 #Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
May 18 #Javascript
JQuery.validate在ie8下不支持的快速解决方法
May 18 #Javascript
12个非常实用的JavaScript小技巧【推荐】
May 18 #Javascript
JQuery解析XML数据的几个简单实例
May 18 #Javascript
JavaScript设计模式开发中组合模式的使用教程
May 18 #Javascript
You might like
Protoss兵种对照表
2020/03/14 星际争霸
PHP中创建并处理图象
2006/10/09 PHP
Adodb的十个实例(清晰版)
2006/12/31 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
Js 中debug方式
2010/02/07 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
python 字典访问的三种方法小结
2019/12/05 Python
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
个性大学生自我评价
2013/12/04 职场文书
《童年》教学反思
2014/02/18 职场文书
医疗纠纷协议书
2014/04/16 职场文书
公司口号大全
2014/06/11 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫