Adapter适配器模式在JavaScript设计模式编程中的运用分析


Posted in Javascript onMay 18, 2016

定义
适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作。速成包装器(wrapper)。

适配器的别名是包装器(wrapper),这是一个相对简单的模式。在程序开发中有许多这样的场景:当我们试图调用模块或者对象的某个接口时,却发现这个接口的格式并不符合目前的需求。这时候有两种解决办法,第一种是修改原来的接口实现,但如果原来的模块很复杂,或者我们拿到的模块是一段别人编写的经过压缩的代码,修改原接口就显得不太现实了。第二种办法是创建一个适配器,将原接口转换为客户希望的另一个接口,客户只需要和适配器打交道。

为什么需要采用适配器模式?
在开发应用程序时,您往往会需要更换其中某一部分,例如,您用于保存日志或类似性质的内容的一个库。 当您用一个新库来替换它时,新库不太可能有完全相同的接口。 从这里开始,您有两种选择:
(1)检查所有代码,并更改指向旧库的一切代码。
(2)创建一个适配器,使新库可以使用与旧库相同的接口。
显然,在一些情况下,假如您的应用程序很小,或者对旧库的引用很少,更合适的做法是检查完整的代码,并更改它以匹配新库,而不是添加一个新的抽象层,使代码更复杂。 但是,在大多数情况下,创建一个适配器更为实用且节省时间。

JavaScript代码示例

一件事情有可能发生时,它就一定会发生。首先让我们来看一下这个小小的LoggerFactory,它让我们能更容易地修改我们使用的日志接口。

var LoggerFactory = {
  getLogger: function() {
    return window.console;
  },
  ...
};

/* 用法示例 */
var logger = LoggerFactory.getLogger();
logger.log("something to log");

在我们调用getLogger时它给我们返回了控制台对象(console)。为了这个练习我们假装console对象只有一个方法——log,并且它只能接收一个字符串类型的参数。 接下来,我们有另一个日志接口,这个会复杂些,因为1)它是用JavaScript实现的,不像console那样是浏览器本身就有的;2)它会把日志通过AJAX发送到服务器,这也意味着我们要对URL数据进行编码(代码里不会具体实现URL编码相关的事,因为它和我们的要讲的适配器模式毫不相干)。当然,它会使用一个和控制台不同的接口。

var AjaxLogger = {
  sendLog: function() {
    var data = this.urlEncode(arguments);

    jQuery.ajax({
      url: "http://example.com/log",
      data: data
    });
  },

  urlEncode: function(arg) {
    ...
    return encodedData;
  },
  ...
};

我们使用了jQuery的AJAX请求,主要是为了节省时间,忽略那些和适配器模式不想干的事情。 我们现在要做的事情就是创建一个适配器,并且改变之前的LoggerFactory让其返回这个适配器而不是控制台对象。

var AjaxLoggerAdapter = {
  log: function(arg) {
    AjaxLogger.sendLog(arg);
  }
};

/* 调整 LoggerFactory */

var LoggerFactory = {
  getLogger: function() {
    // 改变返回值
    return AjaxLoggerAdapter;
  },
  ...
};

我们对现有代码只做了一行更改,整个程序就可以使用这个新的日志接口了。

复杂适配器

日志接口是个很简单的例子,它只有一个方法,把它直接映射到旧的方法上也没什么难的。大多数情况下并不是如此。你可能会碰到这样的问题,即这些互相映射的函数的参数是完全不同的,旧接口可能根本没有这些参数,你必须自己处理它们。某些情况下,你又必须删掉一些参数,因为新的接口根本用不上它们。如果两个对象之间的接口映射太难,我们就要想想别的办法了,反正我不希望查找和修改数千行旧代码。

Javascript 相关文章推荐
js使用eval解析json(js中使用json)
Jan 17 Javascript
原生javascript实现DIV拖拽并计算重复面积
Jan 02 Javascript
JavaScript判断用户是否对表单进行了修改的方法
Mar 18 Javascript
js实现页面跳转的几种方法小结
May 16 Javascript
vue2.0+webpack环境的构造过程
Nov 08 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
May 21 Javascript
Angular.JS读取数据库数据调用完整实例
Jul 02 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
Sep 23 Javascript
vue.js实现二级菜单效果
Oct 19 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 Javascript
vue实现数字动态翻牌的效果(开箱即用)
Dec 08 Javascript
vue3.0中使用element的完整步骤
Mar 04 Vue.js
jQuery添加options点击事件并传值实例代码
May 18 #Javascript
详解JavaScript实现设计模式中的适配器模式的方法
May 18 #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
You might like
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
Python返回数组/List长度的实例
2018/06/23 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
python wsgiref源码解析
2021/02/06 Python
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
简单而又朴实的个人求职信分享
2013/12/12 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
病媒生物防治方案
2014/05/13 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python