JavaScript设计模式(4)-桥接模式
桥接模式
在设计一个 Js API 时,可用来弱化它与使用它的类和对象之间的耦合
1. 事件监听器的回调函数
function getBeerById(id, callback) {
asyncRequest('GET', 'beer.uri?id=' + id, function(res){
callback(resp.responseText)
})
}
function getBeerByIdBridge (e) { // 桥接元素:事件监听器的回调函数
// 避免把 this.id 耦合到函数 getBeerById 中
getBeerById(this.id, function(beer) {
console.log('Requested Beer: ' + beer)
})
}
addEvent(element, 'click', getBeerByIdBridge);
2. 桥接性函数:特权函数
var Public = function() {
var secret = 3;
this.privilegedGetter = function() {
return secret
}
}
// usage
var o = new Public;
var data = o.privilegedGetter()
3. 用桥接模式联结多个类
var Class1 = function(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
}
var Class2 = function(d) {
this.d = d;
}
var BridgeClass = function(a, b, c, d) {
this.one = new Class1(a, b, c);
this.two = new Class2(d)
}
4. 构建 XHR 连接队列
// 获取 xhr 对象函数
var asyncRequest = (function() {
function handleReadyState(o, callback) { // 其实也可以用 xhr.onreadystatechange 来实现而不用 setInterval 来监听 xhr 的 readyState
var poll = window.setInterval(function(){
if(o && o.readyState == 4) {
window.clearInterval(poll);
if(callback) {
callback(o)
}
}
}, 50);
}
var getXHR = function() {
var http;
try {
http = new XMLHttpRequest;
getXHR = function() { // memoizing
return new XMLHttpRequest;
}
}catch(e) {
var msxml = [
'MSXML2.XMLHTTP',
'MSXML2.XMLHTTP.3.0',
'Microsoft.XMLHTTP'
];
for(var i=0, len = msxml.length; i<len; i++) {
try {
http = new ActiveXObject(msxml[i]);
getXHR = function() {
return new ActiveXObject(msxml[i]);
};
break
}catch(e) {
continue;
}
}
}
return http;
};
return function(method, url, callback, postData) {
var http = getXHR();
http.open(method, url, true);
handleReadyState(http, callback);
http.send(postData || null);
return http;
}
})()
Function.prototype.method = function(name, fn) {
this.prototype[name] = fn;
return this
}
// 实现队列
DED.Queue = function() {
this.queue = [];
this.retryCount = 3;
this.currentRetry = 0;
this.paused = false;
this.timeout = 5000;
this.conn = {};
this.timer = {};
}
DED.Queue.method('flush', function(){
if(!this.queue.length > 0) { // 当队列长度等于 0 时进入 if
return;
}
if(this.paused) {
this.paused = false;
return
}
var that = this;
this.currentRetry++;
// 如果在规定次数内,则继续重复请求,否则结束当前该请求
var abort = function() {
that.conn.abort(); // 终止该请求,readyState 属性将被置为 0
if(that.currentRetry == that.retryCount) {
// that.onFailure.fire();
console.log('failure: ' + that.queue[0].url)
that.currentRetry = 0;
} else {
that.flush();
}
}
var callback = function (o) {
document.getElementById('feed-readers').innerText = o.response
console.log(o)
// 停止超时处理程序
window.clearTimeout(that.timer);
that.currentRetry = 0;
// 剔除当前请求成功的请求项
that.queue.shift();
// that.onFlush.fire(o.responseText);
if(that.queue.length == 0) {
// that.onComplete.fire();
return;
}
// 继续新的请求
that.flush()
}
this.conn = asyncRequest(
this.queue[0]['method'],
this.queue[0]['url'],
callback,
this.queue[0]['params']
)
this.timer = window.setTimeout(abort, this.timeout);
}).method('setRetryCount', function(count) {
this.retryCount = count;
}).method('setTimeout', function(time) {
this.timeout = time;
}).method('add', function(o) {
this.queue.push(o);
}).method('pause', function() {
this.paused = true;
}).method('dequeue', function() {
this.queue.pop()
}).method('clear', function() {
this.queue = []
})
// usage
var q = new DED.Queue;
q.setRetryCount(3);
q.setTimeout(1000);
q.add({
method: 'GET',
'url': 'https://www.baidu.com',
});
q.add({
method: 'GET',
'url': 'https://www.baidu.com?xiaoming',
});
q.flush()
// 在真实使用中,可以在添加事件的时候使用桥接函数;
// 也可以提供一个动作调度函数,桥接用户操作所包含的输入信息并将其委托给恰当的处理代码。
5. 桥接模式的利与弊
- 利:
- 将抽象与其实现隔离开,有助于独立地管理软件的各个部分
- Bug更容易查找
- 促进代码的模块化,提高抽象的灵活度
- 可以用来把一组类和函数连接起来,而且提供了一种借助于特权函数访问私有数据的手段
- 弊:
- 增加了函数调用次数,对性能有一些负面影响
- 提高了系统的复杂度
- 不可滥用
注意
转载、引用,但请标明作者和原文地址
JavaScript设计模式(4)-桥接模式的更多相关文章
- 再起航,我的学习笔记之JavaScript设计模式14(桥接模式)
桥接模式 桥接模式(Bridge): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...
- JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载
我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Jav ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- JavaScript设计模式之----组合模式
javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...
- java面试题之----jdbc中使用的设计模式(桥接模式)
1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...
- php设计模式之桥接模式
php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...
- java设计模式7——桥接模式
java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...
- 从ES6重新认识JavaScript设计模式(三): 建造者模式
1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...
- 深入理解JavaScript系列(44):设计模式之桥接模式
介绍 桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化. 正文 桥接模式最常用在事件监控上,先看一段代码: addEvent(element, 'click', getBe ...
随机推荐
- Trie树/字典树题目(2017今日头条笔试题:异或)
/* 本程序说明: [编程题] 异或 时间限制:1秒 空间限制:32768K 给定整数m以及n个数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大 ...
- Html5本地存储和本地数据库
一个网站如何能在客户的浏览器存储更多的数据呢? 在Html4的时代在浏览器端存储点网站个性化的数据,尤其是用户浏览器的痕迹,用户的相关数据等一般只能存储在Cookie中,但是大多是浏览器对于Cooki ...
- Win7 64位操作系统中搭建C/C++的编译环境
通常使用IDE工具为 VS2010 .但是如果仅仅只是想在Windows中使用命令行对C/C++源码进行编译和运行.则需要使用 CL 命令方式或另外安装 Cygwin / MinWin 命令行编译器. ...
- zabbix客户端一键安装脚本
#!/bin/bash #通过命令行参数指定if [ ! -z "$1" ];then ip=$1 echo "手动指定IP:$ip"else#根据默认路由获取 ...
- maven配置全局的jdk和配置局部的jdk
配置全局的jdk需要修改maven的setting.xml文件 <profile> <id>jdk17</id> <activation> <ac ...
- SDP(8):文本式数据库-MongoDB-Scala基本操作
MongoDB是一种文本式数据库.与传统的关系式数据库最大不同是MongoDB没有标准的格式要求,即没有schema,合适高效处理当今由互联网+商业产生的多元多态数据.MongoDB也是一种分布式数据 ...
- 利用fiddler和mock调试本地微信网页
利用fiddler和mock调试本地微信网页 微信公众号网页是比较特殊的页面,普通页面直接打开即可访问,但对于需要请求微信相关接口的部分需要安全域名认证.这导致了使用mock数据进行开发的页面没办法走 ...
- Yii2 给iOS App写推送的接口
public function actionApns() { //手机注册时候返回的设备号,在xcode中输出的,复制过来去掉空格 $deviceToken = '7217a01836349b194b ...
- MysqL 磁盘写入策略之innodb_flush_log_at_trx_commit
本文从参数含义,性能,安全角度阐述两个参数为不同的值时对db 性能,数据的影响,引擎是Innodb的前提下. 取值:0/1/2 innodb_flush_log_at_trx_commit=0,表示每 ...
- Mysql的锁机制与PHP文件锁处理高并发简单思路
以购买商品举例: ① 从数据库获取库存的数量. ② 检查一下库存的数量是否充足. ③ 库存的数量减去买家购买的数量(以每个用户购买一个为例). ④ 最后完成购买. 仅仅这几行逻辑代码在并发的情况下会出 ...