JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】


Posted in Javascript onMay 23, 2020

本文实例讲述了JavaScript设计模式--简单工厂模式。分享给大家供大家参考,具体如下:

第一步,Ajax操作接口(目的是起一个接口检测作用)

(1)引入接口文件

//定义一个静态方法来实现接口与实现类的直接检验
//静态方法不要写出Interface.prototype ,因为这是写到接口的原型链上的
//我们要把静态的函数直接写到类层次上
//(1)定义一个接口类
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("实现类中没有完全实现接口中的所有方法")
   }
  }
 }
}

第二步,实例化一个可以具体的ajax接口

var AjaxHandler=new Interface("AjaxHandler",["request","createXhrObject"]);

第三步,针对接口的ajax实现类

(1)定义一个空类

var SimpleHandler=function(){};

(2)在该空类上直接扩展原型---实现接口里面的方法

SimpleHandler.prototype={
  /*
  * method:get post
  * url:请求地址
  * callback:回调函数
  * postVars:传入参数
  * */
  request:function (method,url,callback,postVars) {
     //1,使用工厂得到xhr对象
   var xhr=this.createXhrObject();

   xhr.onreadystatechange=function () {
    //4代表的意思是交互完成
    if(xhr.readyState!=4) return;
     //200值的是正常交互完成
     //404文件未找到
     //500 内部程序出错
     (xhr.status==200)?callback.success(xhr.responseText,xhr.responseXML):
     callback.failure(xhr.status);
   }
   //打开链接
   xhr.open(method,url,true);
   //设置参数
   if(method!="POST"){
    postVars=null;
   }
   xhr.send(postVars);
  },
  //2,获取xhr的方法--不同浏览器不一样
  createXhrObject:function () {
   var methods=[
    function () {return new XMLHttpRequest();},
    function () {return new ActiveXObject("Microsoft.XMLHTTP");}
   ];
   //利用try--catch 制作一个智能循环体
      for(var i=0;i<methods.length;i++){
       try{
        methods[i]();
       }catch(e) {
        continue;//回到循环开始的地方重新开始
       }
       this.createXhrObject=methods[i]();//非常重要,只有这样才能确保不用每一次请求,全循环数组
       return methods[i]();
      }
   //如果全不对则报错
   throw new Error("error");
  }
 };

第三步,使用检验

(1)实例化对象

var myHandler=new SimpleHandler();

(2)接口检验实现类是否完全实现接口中的方法

Interface.ensureImplement(myHandler,AjaxHandler);
//检验是否实现接口中所有方法

(3)定义一个回调对象

var callback={
  success:function (responseText) {
   alert("ok");
  },
   failure:function (status) {
   alert(status+"failure")
   }
  };

(4)最终的使用格式

myHandler.request("POST","http://www.baidu.com",callback);
//若url为""会默认为本地的链接,其他正确的链接,会出现跨域问题

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

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

Javascript 相关文章推荐
用js查找法实现当前栏目的高亮显示的代码
Nov 24 Javascript
JavaScript 设计模式学习 Factory
Jul 29 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
Jun 17 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
为指定的元素添加遮罩层的示例代码
Jan 15 Javascript
jquery实现简单实用的弹出层效果代码
Oct 15 Javascript
JS+DIV实现的卷帘效果示例
Mar 22 Javascript
Vue 2.0 服务端渲染入门介绍
Mar 29 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
AngularJs中$cookies简单用法分析
May 30 Javascript
ES6中Set和Map用法实例详解
Mar 02 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 #Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
May 22 #Javascript
微信小程序点击滚动到指定位置的实现
May 22 #Javascript
使用JavaScript通过前端发送电子邮件
May 22 #Javascript
uni-app微信小程序登录授权的实现
May 22 #Javascript
jQuery 选择器用法实例分析【prev + next】
May 22 #jQuery
jQuery--遍历操作实例小结【后代、同胞及过滤】
May 22 #jQuery
You might like
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
python与字符编码问题
2019/05/24 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
Python sorted对list和dict排序
2020/06/09 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
亿企通软件测试面试题
2012/04/10 面试题
自荐信结尾
2013/10/27 职场文书
新学期开学标语
2014/06/30 职场文书
新郎结婚感言
2015/07/31 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
2022微信温控新功能上线
2022/05/09 数码科技