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

来源:互联网 发布:手机防御软件 编辑:程序博客网 时间:2024/05/14 01:45

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





原创粉丝点击