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>

转载于:https://www.cnblogs.com/chengyunshen/p/7191781.html

JavaScript设计模式-10.工厂模式实例xhr相关推荐

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

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  2. JavaScript设计模式———抽象工厂模式

    定义: 抽象工厂其实是实现子类继承父类的方法,只是一个方法.抽象工厂模式一般用在多人协作的超大型项目中,并且严格的要求项目以面向对象的思想进行完成. 简单工厂模式和工厂模式都是直接生产实例的,抽象工厂 ...

  3. javascript设计模式-抽象工厂模式

    1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  4. javascript设计模式之工厂模式

    什么是工厂模式? 简单来说:工厂模式是一种 创建模式,用来解决创建对象的问题.根据参数类型,通过调用工厂方法来创建不同类型的对象. 为什么使用工厂模式? 当我们需要根据不同的需要来创建不同对象的时候, ...

  5. 设计模式-抽象工厂模式实例(二)

    (1)案例背景: 计算机包含内存(RAM),CPU等硬件设备 (2)实现步骤: 根据题意,使用抽象工厂模式并画出类图,类图中应包含一个抽象工厂类AbstractFactory, PcFactory和M ...

  6. JavaScript设计模式 - 抽象工厂模式

    抽象工厂模式 这也是针对工厂模式无法应对多对象多复杂对象而出的一种模式,抽象工厂模式并不是直接生成实例,而是对于产品的一个分类的创建 class User {constructor(name, rol ...

  7. javascript设计模式--抽象工厂模式

    抽象工厂模式(abstract Fctory):通过对类的工厂抽象使其业务用于对产品类鏃的创建,而不负责创建某一类产品的实例. //汽车抽象类,当使用其实例对象的方法时会抛出错误var Car = f ...

  8. 设计模式之抽象工厂模式实例(c++)

    抽象工厂模式实例之电器工厂: 电器工厂类图: 此节也用到了C++反射注册机制,可以参考上篇内容,是一样的. 抽象工厂和工厂方法.简单工厂是有关系的.当抽象工厂中的每一个具体工厂类只生产一个产品对象的时 ...

  9. 设计模式—简单工厂模式

    前言 简单工厂模式是一种比较容易理解的设计模式 简单工厂模式介绍 在设计模式中,简单工厂模式可以理解为负责生产对象的一个类,当使用new 关键字创建一个对象时,此时该类就依赖于这个对象,也就是他们间的 ...

最新文章

  1. logrotate管理nginx日志文件
  2. 《JavaScript高级程序设计》笔记总结
  3. python数列分段_按范围分段的Python数组
  4. python中loop的用法_python-在Tensorflow中使用tf.while_loop更新变量
  5. 现在为什么不出翻盖手机了?
  6. 【引用】使用CommonDialog的ShowSave后如何判断是保存还是取消?
  7. WCF引用方式之IIS方式寄宿服务
  8. 递归和循环两种方式求解连续数的相加
  9. Zalo电脑版多开软件
  10. 【PHPWord】PHPWord导出PDF格式文件的几种方式以及最优解并附代码
  11. 知识分享:移动设备的安全管理策略和方法
  12. david lowe 论文_访谈:L. Lee Lowe-博客小说家
  13. 新颖的自我介绍_三句有创意的自我介绍 简短有创意的自我介绍
  14. 特斯拉竞争对手Rivian获7亿美元融资 亚马逊领投
  15. 测试用例的思路---矿泉水瓶
  16. android 语言的设置与获取
  17. log日志输出到文件:
  18. 考研英语单词-近义词分类-Fifth Day
  19. 巧用网页分析“反击”钓鱼网站
  20. 专访华为开发者社区唐九洲:与开发者 “在一起,梦飞扬”

热门文章

  1. Android | Sqlite3
  2. Docker (1) 基本概念和安装
  3. 编写一个函数func(),将此函数的输入参数(int型)逆序输出显示,如54321 – 12345,要求使用递归,并且函数体代码不超过8行...
  4. Chapter 5 Exercises Problems
  5. htaccess文件,强大的功能
  6. 应用程序调试技术(更新程度:完毕)送源码及PPT
  7. 解题报告 百进制数
  8. 转载并学习实现三重DES加密解密代码(一)
  9. 5、Flutter 实现 ViewPager、bottomNavigationBar 界面切换
  10. Android 语音播报,语音识别demo