• JavaScript设计模式-10.工厂模式实例xhr


      1 <!DOCTYPE html>
      2 <html>
      3     <head>
      4         <meta charset="UTF-8">
      5         <title>Javascript高级语法10-工厂模式实例xhr</title>
      6     </head>
      7     <body>
      8         <script>
      9             //接口
     10             var Interface = function(name,methods){
     11                 if(arguments.length != 2){
     12                     alert("interface must have two paramters...");
     13                 }
     14                 this.name = name;//这个是接口的名字
     15                 this.methods = [];//定义个空数组来转载函数名
     16                 for (var i = 0; i < methods.length; i++) {
     17                     if(typeof methods[i] != "string"){
     18                         alert("method name must is String ...")
     19                     }else{
     20                         this.methods.push(methods[i])
     21                     }
     22                 }
     23             }
     24             //定义接口的一个静态方法来实现接口与实现类的直接检验
     25             //静态方法不要写成Interface.prototype.* 因为这是写到接口原型连上的
     26             //我们要把静态的函数直接写到类层次上
     27             Interface.ensureImplements = function(object){
     28                 if(arguments.length<2){
     29                     alert("必须最少是2个参数");
     30                     return false;
     31                 }
     32                 //遍历
     33                 for (var i = 1; i < arguments.length; i++) {
     34                     var inter = arguments[i];
     35                     //如果你是接口就必须是Interface类型的
     36                     if(inter.constructor != Interface){
     37                         throw new Error("if is interface class must is Interface type");
     38                     }
     39                     //遍历函数集合并分析
     40                     for (var j = 0; j < inter.methods.length; j++) {
     41                         var method = inter.methods[j];
     42                         //实现类中必须有方法名字 和 接口中所有的方法名项目
     43                         if(!object[method] || typeof object[method] != "function"){
     44                             throw new Error("实现类并且没有完全实现接口中的所有方法...");
     45                         }
     46                     }
     47                 }
     48             }
     49             
     50             //xhr工厂
     51             function demo1(){
     52                 //Ajax操作接口
     53                 var AjaxHandler = new Interface("AjaxHandler",["request","createXHRObject"]);
     54                 //ajax简单实现类
     55                 var Simplehandler = function(){};
     56                 Simplehandler.prototype = {
     57                     /*method:  get/post
     58                      *url 请求地址
     59                      * callback 回调函数
     60                      * postVars 传入参数
     61                      */
     62                     request:function(method,url,callback,postVars){
     63                         //1.得到xhr对象
     64                         var xhr = this.createXHRObject();
     65                         xhr.onreadystatechange = function(){                
     66                             if(xhr.readyState != 4){  //4代表的意思是交互完成
     67                                 return;
     68                             }
     69                             //200正常交互完成   404 文件没找到  500内部程序出现错误
     70                             (xhr.status == 200)?callback.success(xhr.responseText,xhr.responseXML):
     71                             callback.failure(xhr.status);
     72                         }
     73                         //打开链接 
     74                         xhr.open(method,url,true);//true设置异步
     75                         //设置参数
     76                         if(method != "POST"){
     77                             postVars = null;
     78                         }
     79                         xhr.send(postVars);
     80                         
     81                     },
     82                     createXHRObject:function(){
     83                         var methods = [
     84                         //针对不同的浏览器用不同的方法
     85                             function(){return new XMLHttpRequest();},
     86                             function(){return new ActiveObject('Msxml2.XMLHTTP');},
     87                             function(){return new ActiveObject('Microsoft.XMLHTTP');},
     88                         ]
     89                         //利用try catch制作一个智能循环体
     90                         for(var i=0;i<methods.length;i++){
     91                             try{
     92                                 methods[i]();
     93                             }
     94                             catch(e){
     95                                 continue;
     96                             }
     97                             //这句话非常重要,只有这样才能确保  不用每次请求都循环数组
     98                             this.createXHRObject = methods[i];
     99                             return methods[i]();
    100                         }
    101                         //如果全不对的话就显式报错
    102                         throw new Error("Error");
    103                     }
    104                 }
    105                 
    106                 //实验
    107                 var myHandler = new Simplehandler();
    108                 var callback = {
    109                     success:function(responseText){
    110                         alert("Ok")
    111                     },
    112                     failure:function(status){
    113                         alert("failure")
    114                     }
    115                 }
    116                 myHandler.request("GET","",callback);
    117             }
    118            
    119            demo1();
    120            /*
    121             * 工厂模式使用场合:
    122             * 1.动态实现,创建一些用不同方式实现的同一接口
    123             *          可以被同等对待的一系列类,我们可以用工厂模式来实例化
    124             * 2.节省设置开销,和子系统组合
    125             *          针对不同情况的子系统,进行模块层次的收集,使其子系统使用起来变得更简单。
    126             * 利与弊:
    127             *   松耦合,把创建类等复杂的过程交给工厂来完成,程序员有时间和经历放到重点业务上
    128             * 
    129             *  弊端:工厂好用,但处理起来很复杂
    130             *      代码复杂度会随之增高,一般的程序员很难驾驭
    131             *         一般的简单的类 推荐还是用new 比较好
    132             */
    133         </script>
    134     </body>
    135 </html>
  • 相关阅读:
    寒假学习10
    寒假学习9
    寒假学习8
    寒假学期7
    寒假学习6
    寒假学习5
    寒假学习4
    Notification通知栏的使用
    Service的使用
    BroadcastReceive的使用
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/7191781.html
Copyright © 2020-2023  润新知