码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript设计模式--简单工厂模式例子---XHR工厂

时间:2017-10-16 11:15:59      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:null   inter   程序   集合   callback   ret   active   and   xhr   

第一步,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为""会默认为本地的链接,其他正确的链接,会出现跨域问题

 

JavaScript设计模式--简单工厂模式例子---XHR工厂

标签:null   inter   程序   集合   callback   ret   active   and   xhr   

原文地址:http://www.cnblogs.com/bfwbfw/p/7675542.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!