javascript设计模式漫谈之使用委托
这里举一个委托在异步调用中例子,来说明委托的用法,例子是对XmlHttp的简单封装:
<!--
/*
* XmlHttp 类
*/
var XmlHttp = function() {
var o = null;
var readyStateChange = function(processResponseProc) {
if (o.readyState == 4) {
if (o.status == 200) {
processResponseProc(o.responseText);
} else {
processResponseProc(null);
}
}
};
return {
/*
* init 方法
*
* 返回值
* 如果初始化成功则返回true,否则返回false
*
* 说明
* 初始化XmlHttp对象,
*/
init : function() {
if (o == null) {
if (window.XMLHttpRequest) {
try {
o = new XMLHttpRequest();
} catch (ex) {
return false;
}
} else if (window.ActiveXObject) {
try {
o = new ActiveXObject("Msxml4.XMLHttp");
} catch (ex) {
try {
o = new ActiveXObject("Msxml2.XMLHttp");
} catch (ex) {
try {
o = new ActiveXObject("Microsoft.XMLHttp");
} catch (ex) {
return false;
}
}
}
}
}
return true;
},
/*
* get 方法
*
* 参数
* url - 要请求的url
* processResponse - 处理返回结果委托
*
* 返回值
* 如果请求发起成功则返回true,否则返回false
*
* 说明
* 发起http请求
*/
get : function(url, processResponse) {
try {
o.open("GET", url, true);
o.onreadystatechange = function() { readyStateChange(processResponse); };
o.send();
return true;
} catch (ex) {
return false;
}
},
/*
* post 方法
*
* 参数
* url - 要请求的url
* data - 发送的数据,注意这里值必须是urlencode过的
* processResponse - 处理返回结果委托
*
* 返回值
* 如果请求发起成功则返回true,否则返回false
*
* 说明
* 发起post请求
*/
post : function(url, data, processResponse) {
processResponseProc = processResponse;
try {
o.open("POST", url, true);
o.onreadystatechange = function() { readyStateChange(processResponse); };
o.setRequestHeader("Content-Length", data.length);
o.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
o.send(data);
return true;
} catch (ex) {
return false;
}
}
};
};
var xmlhttp = new XmlHttp();
if (xmlhttp.init()) {
xmlhttp.get("http://pstgroup.blogspot.com/", function(response) {
if (response != null) {
document.write(response);
}
});
}
//-->
</script>
这里get和post方法都是异步调用,都需要传入有一个processResponse参数,这个参数是http返回内容处理函数,也就是我们所说的委托概念,对象内部会在http请求返回后回调该函数来处理返回的内容,委托这个词很形象,XmlHttp类并不知道调用者要对返回结果干些什么,于是就委托给这个传递近来的函数来做。
委托可以很好的降低不同功能之间的耦合,这个例子使用委托就符合Open-Close原则,如果有新的处理返回结果的需求可以很容易扩展,不用改动现有代码,比如我们的新需求是alert返回结果:
if (xmlhttp.init()) {
xmlhttp.get("http://pstgroup.blogspot.com/", function(response) {
if (response != null) {
alert(response);
}
});
}
委托之所以适合异步调用,是因为异步调用符合委托的使用场景:调用者A调用被调用者B,由于调用过程是异步的,不会立刻返回结果,所以B在拿到返回结果时,有需要依赖于A来处理结果。当在类设计时发现类之间双向互相依赖的情况时,可以考虑使用委托。
转载于:https://www.cnblogs.com/wscript/archive/2007/09/11/889530.html
javascript设计模式漫谈之使用委托相关推荐
- JavaScript设计模式与开发实践——JavaScript的多态
"多态"一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的 ...
- 《JavaScript设计模式与开发实践》阅读摘要
<JavaScript设计模式与开发实践>作者:曾探 系统的介绍了各种模式,以及js中的实现.应用,以及超大量高质量代码,绝对值得一读 面向对象的js 静态类型:编译时便已确定变量的类型 ...
- javascript 设计模式_开发者都应该了解的7种JavaScript设计模式
你好,欢迎收听极客视点. JavaScript 中的设计模式指的是一些可重用的解决方案,这些方案适用于编写 JavaScript Web 应用程序时常见的一些问题.最近,全栈开发人员德文(Deven) ...
- javascript设计模式_开发者都应该了解的7种JavaScript设计模式
你好,欢迎收听极客视点. JavaScript 中的设计模式指的是一些可重用的解决方案,这些方案适用于编写 JavaScript Web 应用程序时常见的一些问题.最近,全栈开发人员德文(Deven) ...
- JavaScript设计模式(一)
设计模式概念 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. ...
- JavaScript设计模式——单例模式的理解与应用
JavaScript设计模式--对单例模式的一些见解 JavaScript设计模式主要分类: ①创建型设计模式,例如单例模式.工厂模式 ②结构型设计模式,例如装饰者模式.适配器模式 ③行为型设计模式, ...
- JavaScript设计模式返璞归真
闲话 本文写于2月初,原分享在有道云笔记上,现在转移到此.现阶段对于设计模式的理解还没有能力对本文的框架做出大的翻新,所以暂且原样搬过来了. 本文不从名目众多的设计模式谈起,而是为语言能力.代码优化. ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- JavaScript设计模式浅析
JavaScript设计模式浅析 JavaScript设计模式浅析 一.工厂模式 1.简单的工程模式 2.工程模式实例 二.建造者模式 1.建造者模式例子 三.单体模式 1.普通创建对象方式 2.单体 ...
最新文章
- 爬虫基础, 乱码问题, jupyter, urllib, requests, lxml, multiprocessing并发, session, beautifulsoup...
- JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码)
- java合并整形_Java:合并InputStreams(Java: merging InputStreams)
- Mysql查询数据库状态及信息
- 统计各个函数的耗时_分享一次CMS GC耗时狠高优化过程全记录
- tinyxml 读取文本节点_在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件...
- RedisTemplate常用集合使用说明-opsForValue(二)
- SQL server 数据库 (函数篇 2)
- mysql下载环境_windows下安装mysql需要什么环境
- java day31【web概念概述 、HTML】
- Oracle 查看 SQL执行计划 SQL性能分析
- CIF、DCIF、D1分辨率是多少?
- 计算机三级-数据库技术
- IDM下载出现503错误
- 创新实训(11)——推荐系统实现之基于流行度和新鲜度的推荐
- kindle4.1.1越狱
- 《影响力》(你为什么会说“是”?)读书
- 社会生活——《哥哥又逃票了》
- 进栈,出栈的详细知识
- 65款实用Chrome插件推荐
热门文章
- fragment 使用抽屉栏的_iPhone 这些使用小技巧,我不说你可能不知道哦
- 测量接线导通问题解决方案
- 室外声音信标可行性分析
- 位置传感器:电位器,电容位置传感器
- python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...
- python的认识_理解 Python 中的 *args 和 **kwargs
- usb扩展坞同时接键盘鼠标_这个多功能扩展坞,增加多个接口,笔记本秒变工作站...
- linux 检测添加磁盘空间,Linux构造磁盘空间满的测试环境
- 百融金服榕树_百融金服榕树成为拉动新金融行业增长的主力军
- 实现费用管理 mysql_移动电费房租管理系统的设计与实现(IDEA,MySQL)