<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Javascript高级语法10-工厂模式实例xhr</title>
</head>
<body>
<script>
//接口
var Interface = function(name,methods){
if(arguments.length != 2){
alert("interface must have two paramters...");
}
this.name = name;//这个是接口的名字
this.methods = [];//定义个空数组来转载函数名
for (var i = 0; i < methods.length; i++) {
if(typeof methods[i] != "string"){
alert("method name must is String ...")
}else{
this.methods.push(methods[i])
}
}
}
//定义接口的一个静态方法来实现接口与实现类的直接检验
//静态方法不要写成Interface.prototype.* 因为这是写到接口原型连上的
//我们要把静态的函数直接写到类层次上
Interface.ensureImplements = function(object){
if(arguments.length<2){
alert("必须最少是2个参数");
return false;
}
//遍历
for (var i = 1; i < arguments.length; i++) {
var inter = arguments[i];
//如果你是接口就必须是Interface类型的
if(inter.constructor != Interface){
throw new Error("if is interface class must is Interface type");
}
//遍历函数集合并分析
for (var j = 0; j < inter.methods.length; j++) {
var method = inter.methods[j];
//实现类中必须有方法名字 和 接口中所有的方法名项目
if(!object[method] || typeof object[method] != "function"){
throw new Error("实现类并且没有完全实现接口中的所有方法...");
}
}
}
} //xhr工厂
function demo1(){
//Ajax操作接口
var AjaxHandler = new Interface("AjaxHandler",["request","createXHRObject"]);
//ajax简单实现类
var Simplehandler = function(){};
Simplehandler.prototype = {
/*method: get/post
*url 请求地址
* callback 回调函数
* postVars 传入参数
*/
request:function(method,url,callback,postVars){
//1.得到xhr对象
var xhr = this.createXHRObject();
xhr.onreadystatechange = function(){
if(xhr.readyState != 4){ //4代表的意思是交互完成
return;
}
//200正常交互完成 404 文件没找到 500内部程序出现错误
(xhr.status == 200)?callback.success(xhr.responseText,xhr.responseXML):
callback.failure(xhr.status);
}
//打开链接
xhr.open(method,url,true);//true设置异步
//设置参数
if(method != "POST"){
postVars = null;
}
xhr.send(postVars); },
createXHRObject:function(){
var methods = [
//针对不同的浏览器用不同的方法
function(){return new XMLHttpRequest();},
function(){return new ActiveObject('Msxml2.XMLHTTP');},
function(){return new ActiveObject('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");
}
} //实验
var myHandler = new Simplehandler();
var callback = {
success:function(responseText){
alert("Ok")
},
failure:function(status){
alert("failure")
}
}
myHandler.request("GET","",callback);
} demo1();
/*
* 工厂模式使用场合:
* 1.动态实现,创建一些用不同方式实现的同一接口
* 可以被同等对待的一系列类,我们可以用工厂模式来实例化
* 2.节省设置开销,和子系统组合
* 针对不同情况的子系统,进行模块层次的收集,使其子系统使用起来变得更简单。
* 利与弊:
* 松耦合,把创建类等复杂的过程交给工厂来完成,程序员有时间和经历放到重点业务上
*
* 弊端:工厂好用,但处理起来很复杂
* 代码复杂度会随之增高,一般的程序员很难驾驭
* 一般的简单的类 推荐还是用new 比较好
*/
</script>
</body>
</html>

JavaScript设计模式-10.工厂模式实例xhr的更多相关文章

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

    第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方法不要写出Interface.prototype ,因为这是写到接 ...

  2. JavaScript设计模式之工厂模式

    一.工厂模式概念 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子类可以重写接口方法以便创建的时候指定自己的对象类型(抽象工厂). 这个模 ...

  3. JavaScript设计模式(3)-工厂模式

    工厂模式 1. 简单工厂 简单工厂:使用一个类或对象封装实例化操作 假如我们有个自行车商店类 BicycleShop,它提供了销售自行车的方法可以选择销售两类自行车 Speedster,Comfort ...

  4. JavaScript设计模式--简单工厂模式

    一,介绍 工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类. 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子类可以重写接口 ...

  5. javaScript设计模式之----工厂模式

    什么是工厂模式?我们通过一个例子了解一下: 比如我们想要弹出几个字符串 function funA(){ alert('a'); } function funB(){ alert('b'); } fu ...

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

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. JS设计模式——7.工厂模式(示例-XHR)

    XHR工厂 基本实现 var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXHR']); var SimpleHandl ...

  8. 【javascript】javascript设计模式之工厂模式

    1.要解决的问题 2.如何实现 3.与构造函数的区别 4.总结 1.要解决的问题 工厂模式通常用于重复创建相似对象,提供动态创建对象的接口. 2.工厂模式最为设计模式中构造模式之一,通常在类或类的静态 ...

  9. JavaScript设计模式-9.工厂模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. B-spline Curves 学习之B样条基函数计算实例(3)

    B-spline Basis Functions: Computation Examples 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完 ...

  2. Metasploit学习指南—基础篇

    Metasploit是一款强大的渗透测试平台,其中包括了很多渗透测试利器,本文简单介绍一下Metasploit的配置和基础的使用方法,主要包括以下几个方面: Metasploit的核心 基础的配置 M ...

  3. 深水划水队项目---七天冲刺之day4

    由于有一名队员回家了,所以今天的站立式会议改成微信群线上讨论 工作进度: 1.游戏界面进一步美化中. 2.游戏基本功能已经初步实现. 3.计划今天内商讨出如何实现游戏中的难度选择功能与道具功能. 工作 ...

  4. jsp中路径的写法

    在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况 代码” ${pageContext.request.context ...

  5. Reverting back to the R12.1.1 and R12.1.3 Homepage Layout

    Reverting back to the 12.1.1 Homepage Layout Set the following profiles: FND: Applications Navigator ...

  6. Python学习-10.Python函数定义(二)

    在Python中定义函数的时候,可以使用参数默认值的方式定义函数 例子: def welcome(who,state='is',action='talking'): print(who,state,a ...

  7. [20190423]oradebug peek测试脚本.txt

    [20190423]oradebug peek测试脚本.txt --//工作测试需要写一个oradebug peek测试脚本,不断看某个区域内存地址的值. 1.环境: SCOTT@book> @ ...

  8. C/C++内存泄露及检测工具

    内存泄漏的定义   一般我们常说的内存泄漏是指堆内存的泄漏.堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内 存.应用程序一般使用malloc,re ...

  9. Android阻止AlertDialog关闭

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("测试" ...

  10. ElasticSearch5.0——IK词库加载

    Dictionary ConfigurationIKAnalyzer.cfg.xml can be located at {conf}/analysis-ik/config/IKAnalyzer.cf ...