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>

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java web scala_spring boot+scala编写web接口

本人是Java开发者&#xff0c;有面向对象的基础&#xff0c;而Scala也是面向对象的语言&#xff0c;学习后可快速入门。通过学习Scala的面向对象(和java面向对象类似)、Scala的高级函数(map,reduce等&#xff0c;和Java8中的stream编程类似)、Scala的隐式转换(在Java中可通过sp…

java对象引用出错_上传图片错误:尝试在空对象引用上调用虚拟方法’java.lang.String android.net.Uri.getLastPathSegment()’...

我有“用相机捕获图像”的问题,并将其存储到Firebase中.我认为该代码是正确的,因为它可以与“从图库中选择图像”一起使用.捕获完图像后,该应用程序停止了,并且没有存储在数据库中.我认为这对于android M和N是个问题.我只是看到其他类似的问题,但它们对我不起作用.我为此寻求帮…

数组的运用

一、数组的概念以及定义&#xff1a; 1、 数组是存储同一种数据类型多个元素的集合&#xff0c;也可以看作是一个容器。 2、数组既可以存储基本数据类型&#xff0c;也可以存储引用数据类型。 二、一维数组&#xff1a; 1、一维数组的定义&#xff1a; 数据类型 [ ] 数组名 ne…

java小应用_java小应用

第一次使用简书记笔记&#xff0c;主要目的是为了加深印象&#xff0c;方便忘记时及时翻看。hello.java代码如下&#xff1a;import java.applet.Applet;import java.awt.*;public class hello extends Applet{private Font f1;public void init(){f1 new Font("宋体&quo…

POJ 2288 Islands and Bridges(状压dp)

http://poj.org/problem?id2288 题意&#xff1a; 有n个岛屿&#xff0c;每个岛屿有一个权值V&#xff0c;一条哈密顿路径C1&#xff0c;C2&#xff0c;...Cn的值为3部分之和&#xff1a; 第1部分&#xff0c;将路径中每个岛屿的权值累加起来&#xff1b;第2部分&#xff0c;对…

java做橡皮擦效果_HTML5 canvas橡皮擦擦拭效果

这是一款HTML5 canvas橡皮擦擦拭效果。该效果通过canvas来制作遮罩层和擦拭用的橡皮擦&#xff0c;用户可以通过移动鼠标来移除遮罩层&#xff0c;效果非常炫酷。因为发代码有时会排版混乱&#xff0c;所以先发图演示了。源码已经打包好了&#xff0c;想学习的朋友可以下载练习…

web前端开发面试题(答案)

1.xhtml和html有什么区别&#xff1f; HTML是一种基本的WEB网页设计语言&#xff0c;XHTML是一个基于XML的置标语言最主要的不同&#xff1a;XHTML 元素必须被正确地嵌套。XHTML 元素必须被关闭。标签名必须用小写字母。XHTML 文档必须拥有根元素。 2.行内元素有哪些?块级元素…

mysql to mssql_MysqlToMsSql

MysqlToMsSql是一款简单易用的数据库迁移工具&#xff0c;这款软件功能强大&#xff0c;可以帮助用户将MySQL数据库内容转移到msSQL数据库中&#xff0c;采用可视化操作&#xff0c;支持预览&#xff0c;方便用户查看数据库&#xff0c;实用性强&#xff0c;有需要的用户快来下…

java延迟覆盖_高效Java第九条覆盖equals时总要覆盖hashCode

原标题&#xff1a;高效Java第九条覆盖equals时总要覆盖hashCode高效Java第九条覆盖equals时总要覆盖hashCode在每个覆盖了equals方法的类中&#xff0c;也必须覆盖hashCode方法。否则会导致该类无法与基于散列的集合一起正常运作。 hashCode约定在应用程序的执行期间&#xff…

原生js简单实现双向数据绑定原理

根据对象的访问器属性去监听对象属性的变化&#xff0c;访问器属性不能直接在对象中设置&#xff0c;而必须通过 defineProperty() 方法单独定义。 访问器属性的"值"比较特殊&#xff0c;读取或设置访问器属性的值&#xff0c;实际上是调用其内部特性&#xff1a;get…

Flyweight Design Pattern 共享元设计模式

就是利用一个类来完毕多种任务&#xff0c;不用每次都创建一个新类。 个人认为这个设计模式在C里面。好像能够就使用一个函数取代&#xff0c;利用重复调用这个函数完毕任务和重复利用这个类&#xff0c;好像差点儿相同。 只是既然是一个设计模式&#xff0c;那么就使用类来完毕…

java中write方法报错_Java中管道报错:Write end dead

今天看了下关于管道的通信&#xff0c;Java中的管道只能在同一进程的不同线程间通信。今天测试两个线程进行通信发现报错。下面是我测试的代码。package com.wpl.testIO;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;public …

Linux课堂笔记-第二天

Shell简介 在Linux系统中&#xff0c;shell是最常用程序&#xff0c;作用侦听用户命令&#xff0c;启动命令所指定的进程并将结果返回给用户。他还是一种程序设计语言&#xff0c;是系统维护时的重要工具。 两部分组成&#xff0c;#为命令行提示符&#xff1b;#为超级用户&…

java多属性的map_java - 具有多个参数的MapStruct QualifiedByName - 堆栈内存溢出

目前&#xff0c;MapStruct不支持具有多个源属性的映射方法。但是&#xff0c;在您的情况下&#xff0c;您可以使用1.2.0中的Context 。 根据我的理解&#xff0c; projId和code就像映射的帮助器一样&#xff0c;它们不用于映射目标属性。所以你可以做一些事情(它应该在理论上起…

用带参数的方法给空数组放元素,寻找数组里面的值是否存在。

package ch08;import java.util.Scanner;/** * Created by liwenj on 2017/7/20. */public class Person { String[] names new String[30];//把为null的元素添加内容 void addName(String name) { for (int i 0; i < names.length; i) { if (nam…

centos中配置java视频教程_安装CentOs

Redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作…

python-day8-赋值

# x10#链式赋值# abcdef10# print(a,b,c,d,e,f)#增量赋值# x10# ya# tempx# xy# ytemp# print(x,y)# x,yy,x# print(x,y)#值的解压# msghello# l[1,2,3]# a,b,c,d,emsg# print(a,b,c,d,e)# a,_,_,_,emsg# a,*_,emsg# print(a)# print(e)# dic{a:1,b:2,c:3}# x,y,zdic# print(x,…

java getapplicationcontext_java – getApplicationContext()中的空指针

我正在尝试以下代码,其中一个服务正在实现我的监听器&#xff1a;public class MyListenerClass extends Service implements MyListenerInterface {public void onCurrencyRecieved(MyEventClass event) {System.out.println("Coins Recieved - Listener Successful"…

怎样解决MySQL数据库主从复制延迟的问题?

1.网络超时2.慢查询3.流量 问题一&#xff1a;主库的从库太多&#xff0c;导致复制延迟从库数据以3-5个为宜&#xff0c;要复制的从节点数量过多&#xff0c;会导致复制延迟问题二&#xff1a;从库硬件比主库差&#xff0c;导致复制延迟查看Master和Slave的系统配置&#xff0c…

神盾局特工第四季/全集Agents Of SHIELD迅雷下载

英文全名Agents Of SHIELD&#xff0c;第4季(2016)ABC. 本季看点&#xff1a;《神盾局特工》&#xff08;Agents Of SHIELD&#xff09;第三季季终集里&#xff0c;我们终于知道谁死了……但死的不是一个&#xff0c;而是两个。在这两集中&#xff0c;很多角色都遭遇过险境&…