JavaScript适配器模式原理与用法实例详解


Posted in Javascript onMarch 09, 2020

本文实例讲述了JavaScript适配器模式原理与用法。分享给大家供大家参考,具体如下:

适配模式可用来在现有接口和不兼容的类之间进行适配,使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象。

基本理论

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

适配器主要有3个角色组成:

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

此处 有一个实例是关于两个数的加法的。

一,先有一个能够实现,两个数加法的服务和客户端。

(1)先引入接口检验类----检查实现该接口的类是否实现了接口中所用方法。

//(定义一个静态方法来实现接口与实现类的直接检验
//静态方法不要写出Interface.prototype ,因为这是写到接口的原型链上的
//我们要把静态的函数直接写到类层次上
//定义一个接口类
var Interface=function (name,methods) {//name:接口名字
  if(arguments.length<2){
    alert("必须是两个参数")
  }
  this.name=name;
  this.methods=[];//定义一个空数组装载函数名
  for(var i=0;i<methods.length;i++){
    if(typeof methods[i]!="string"){
      alert("函数名必须是字符串类型");
    }else {
      this.methods.push( methods[i]);
    }
  }
};
Interface.ensureImplement=function (object) {
  if(arguments.length<2){
    throw new Error("参数必须不少于2个")
    return false;
  }
  for(var i=1;i<arguments.length;i++){
    var inter=arguments[i];
    //如果是接口就必须是Interface类型
    if(inter.constructor!=Interface){
      throw new Error("如果是接口类的话,就必须是Interface类型");
    }
    //判断接口中的方法是否全部实现
    //遍历函数集合
    for(var j=0;j<inter.methods.length;j++){
      var method=inter.methods[j];//接口中所有函数

      //object[method]传入的函数
      //最终是判断传入的函数是否与接口中所用函数匹配
      if(!object[method]||typeof object[method]!="function" ){//实现类中必须有方法名字与接口中所用方法名相同
        throw new Error("实现类中没有完全实现接口中的所有方法")
      }
    }
  }
}

(2)使用接口类同一接口

var InterfaceResult=new Interface("InterfaceResult",["add"]);

(3)服务端两个数的加法

function First() {
    this.add=function (x,y) {
     return x+y;
    }
    Interface.ensureImplement(this,InterfaceResult);//接口检验
  }

(4)客户端调用服务端代码

var first=new First();
alert(first.add(1,2)) ;//3

二,现在有一个要求就是,需要换一个类库,但是客户端的程序不希望有大的改动。

(1)依然继承相同接口的基础上,类库为

function Second() {
    this.add=function (numberList) {
      //[1,2,3] "1+2+3" eval("1+2+3")
      return eval(numberList.join("+"));
    }
    Interface.ensureImplement(this,InterfaceResult);//检验当前类是否完全实现接口中的方法
  }

此时我们如果需要使用该类库的话,客户端又不能该,那么用和之前的调用方式:

var second=new Second();
alert(second.add(1,3));//已经不能这样使用了

是完全不符合客户端的要求的。为了在保证客户端不变的情况下,又能使用新的类库,我们需要使用适配器模式。现在接口发生了变化,使用适配器兼容,以便适应客户端的不变

使客户端与新的接口相会兼容。

(2)适配器

function ThirdWarpper() {
       this.add=function (x,y) {
         var arr=new Array();
         arr.push(x);
         arr.push(y);
         return new Second().add(arr);
       }
       Interface.ensureImplement(this,InterfaceResult);
     }

(3)客户端代码

//客户端
  var third=new ThirdWarpper();
   var result= third.add(1,8);//传递数
   alert(result);

针对上述的使用新的类库后的图解为:

 JavaScript适配器模式原理与用法实例详解

总结,

从表面上看,适配器模式很像外观模式。它们都要对别的对象进行包装并改变其呈现的接口。二者的差别在于它们如何改变接口。外观元素展现的是一个简化的接口,它并不提供额外的选择,
而且有时为了方便完成常见任务它还会做出一些假定。而适配器则要把一个接口转换为另一个接口,它并不会滤除某些能力,也不会简化接口。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.3water.com/code/WebCodeRun测试上述代码运行效果。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
Jul 31 Javascript
读jQuery之十一 添加事件核心方法
Jul 31 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
Oct 29 Javascript
解析javascript中鼠标滚轮事件
May 26 Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 Javascript
javascript模块化简单解析
Apr 07 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
JS瀑布流实现方法实例分析
Dec 19 Javascript
使用DataTable插件实现异步加载数据
Nov 19 Javascript
微信小程序图片自适应实现解析
Jan 21 Javascript
vue3获取当前路由地址
Feb 18 Vue.js
JavaScript中的this基本问题实例小结
Mar 09 #Javascript
Nuxt页面级缓存的实现
Mar 09 #Javascript
JavaScript设计模式之门面模式原理与实现方法分析
Mar 09 #Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 #Javascript
前端深入理解Typescript泛型概念
Mar 09 #Javascript
js实现无缝轮播图效果
Mar 09 #Javascript
js实现无缝轮播图
Mar 09 #Javascript
You might like
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
在PHP的图形函数中显示汉字
2006/10/09 PHP
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python中的闭包用法实例详解
2015/05/05 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
土木工程应届生求职信
2013/10/31 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书