JavaScript设计模式-10.工厂模式实例xhr
<!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的更多相关文章
- JavaScript设计模式--简单工厂模式例子---XHR工厂
第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方法不要写出Interface.prototype ,因为这是写到接 ...
- JavaScript设计模式之工厂模式
一.工厂模式概念 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子类可以重写接口方法以便创建的时候指定自己的对象类型(抽象工厂). 这个模 ...
- JavaScript设计模式(3)-工厂模式
工厂模式 1. 简单工厂 简单工厂:使用一个类或对象封装实例化操作 假如我们有个自行车商店类 BicycleShop,它提供了销售自行车的方法可以选择销售两类自行车 Speedster,Comfort ...
- JavaScript设计模式--简单工厂模式
一,介绍 工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类. 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子类可以重写接口 ...
- javaScript设计模式之----工厂模式
什么是工厂模式?我们通过一个例子了解一下: 比如我们想要弹出几个字符串 function funA(){ alert('a'); } function funB(){ alert('b'); } fu ...
- javascript设计模式-抽象工厂模式
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS设计模式——7.工厂模式(示例-XHR)
XHR工厂 基本实现 var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXHR']); var SimpleHandl ...
- 【javascript】javascript设计模式之工厂模式
1.要解决的问题 2.如何实现 3.与构造函数的区别 4.总结 1.要解决的问题 工厂模式通常用于重复创建相似对象,提供动态创建对象的接口. 2.工厂模式最为设计模式中构造模式之一,通常在类或类的静态 ...
- JavaScript设计模式-9.工厂模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- 在spark中启动standalone集群模式cluster问题
spark-submit --master spark://master:7077 --deploy-mode cluster --driver-cores 2 --driver-memory 100 ...
- SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器 /** * cookie对象; * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cooki ...
- Hadoop各个组件与端口
组件 Daemon 端口 配置 说明 HDFS DataNode 50010 dfs.datanode.address datanode服务端口,用于数据传输 HDFS DataNode 50075 ...
- WPF绑定BitMapImage
先说下图片文件存在服务器.wpf常用绑定图片地址没办法用.忽然想到,convert能否转字节数据?实验了下可以. 图片绑定字节数组. convert代码 public class PictureCon ...
- WPF XamlObjectWriterException:无法创建未知类型"Grid"
using (FileStream fs = new FileStream("UnitFile/Report2.xaml", FileMode.Open)) { rootEleme ...
- C#基础笔记(第十九天)
1.CSS 层叠样式表 对HTML的补充实现网页内容和页面效果的彻底分离1.内联样式表(在标签内设置元素的样式)<p style="background:red; font-size: ...
- 回去看linux的指令
SYNC CL : MSM8953 @ CL#:12212299 PROJECT PATH : // Platform / N / NILE / COMBINATION / MSM8953 Cross ...
- BZOJ4283: 魔法少女伊莉雅(最短路径图+最短路径树)
题面 传送门 题解 太长了不想写了→_→ 题解 //minamoto #include<bits/stdc++.h> #define R register #define inf 0x3f ...
- LINUX中软RAID的实现方案
转自linux就该这么学 应用场景 Raid大家都知道是冗余磁盘的意思(Redundant Arrays of Independent Disks,RAID),可以按业务系统的需要提供高可用性和冗余性 ...
- Myeclipse修改项目名称发布后web Context root名称无法修改
选中项目,右键--->Properties--->在搜索框搜索:deployment as 然后点击显示出的搜索项.修改右侧视图的Web Context Root名称即可. 如图: