桥接模式的用途

在实现API的时候,桥接模式非常有用.

在设计一个JavaScript API的时候,可以用这个模式来弱化它与使用它的类和对象之间的耦合.

示例:事件监听器

桥接模式最常见和实际的应用的场合之一是事件监听器回调函数.

假设有一个名为getBeerById的API函数,它根据一个标识符返回有关某种啤酒的信息.

常规的实现:

addEvent(element,'click', getBeerById);
function getBeerById(e){
var id = this.id;
asyncRequest('GET', 'beer.uri?id='+id, function(resp){
console.log('OK');
});
}

我们看到他是从this环境中获得的ID.如果你要对这个API函数做单元测试,或在命令行环境中执行他,那就没法了.

对API开发来说,最好从一个优良的API开始,不要把他与任何特定的实现(环境)搅在一起.

改进的实现

function getBeerById(id, callback){
asyncRequest('GET', 'beer.uri?id='+id, function(resp){
callback(resp.responseText);
});
}

这实现要好很多了,也许我们做到这里就已经足够了.但是,我们可以进一步用桥接模式把抽象隔离开来.从而弱化它与实现它的对象之间的耦合.

桥接的实现

addEvent(element, 'click', getBeerByIdBridge);
function getBeerByIdBridge (){
getBeerById(this.id, function(beer){
console.log('OK');
});
}

其实我们可以直接如下使用:

addEvent(element, 'click', getBeerById(this.id, function(e){
console.log('OK');
}));

那么,我们为什么要用桥接这个模式呢?

存在的就是合理的,试想当我们需要修改getBeerById的参数的时候,如果不用桥接模式,那么我们岂不是要在每一处注册的地方去修改一次,如果用了桥接模式,那么只要修改一次就OK了.

示例:特权函数

如果一个公用的接口抽象了一些也许应该属于私用性的较复杂的任务,那么可以使用桥接模式来收集某些私用性的信息.可以用一些具有特权的方法作为桥梁以便访问私用变量空间,也就是特权函数.

var Public = function(){
var secret = 2;
this.privilegedGetter = function(){
return secret;
};
};
var o = new Public();
var data = o.privilegedGetter();

示例:用桥接模式联结多个类

var Class1 = function(a){
this.a = a;
};
var Class2 = function(b){
this.b = b;
};
var BridgeClass = function(a, b){
this.one = new Class1(a);
this.two = new Class2(b);
};

这个看起来很像适配器:接收大量的数据,并将其发送给责任方的一种辅助必手段.

示例:构建XHR连接队列

有待补充...

JS设计模式——8.桥接模式的更多相关文章

  1. js设计模式(3)---桥接模式

    0.前言 看设计模式比较痛苦,一则是自己经验尚浅,不能体会到使用这些设计模式的益处:二则是不能很好把握使用这些设计模式的时机.所以这一部分看得断断续续,拖拖拉拉,为了了却这快心病,决定最近一口气看完几 ...

  2. JS设计模式——5.单体模式

    JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html   单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...

  3. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  4. java面试题之----jdbc中使用的设计模式(桥接模式)

    1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...

  5. php设计模式之桥接模式

    php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...

  6. js设计模式——7.备忘录模式

    js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...

  7. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  8. js设计模式——5.状态模式

    js设计模式——5.状态模式 代码演示 /*js设计模式——状态模式*/ // 状态(红灯,黄灯,绿灯) class State { constructor(color) { this.color = ...

  9. js设计模式——4.迭代器模式

    js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...

随机推荐

  1. Luogu4885 灭顶之灾

    显然1的位置确定了整个矩阵,每一段连续的数即是对该位置的限制.化一下式子可以发现是一段区间或一段区间的补集,最后要求的是他们的交.看起来不太好求,于是转为求补集的并,那么排个序就完了. #includ ...

  2. 【刷题】BZOJ 5091 [Lydsy1711月赛]摘苹果

    Description 小Q的工作是采摘花园里的苹果.在花园中有n棵苹果树以及m条双向道路,苹果树编号依次为1到n,每条道路的两端连接着两棵不同的苹果树.假设第i棵苹果树连接着d_i条道路.小Q将会按 ...

  3. 【BZOJ2024】舞会(动态规划,容斥,高精度)

    [BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女 ...

  4. Miiler-Robin素数测试与Pollard-Rho大数分解法

    板题 Miiler-Robin素数测试 目前已知分解质因数以及检测质数确定性方法就只能\(sqrt{n}\)试除 但是我们可以基于大量测试的随机算法而有大把握说明一个数是质数 Miler-Robin素 ...

  5. (转)Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web mod

    背景:在sts中导入web项目,却不能通过sts中的tomcat来加载该服务,并报出如下错误. “Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4 ...

  6. 【整体二分】【P3834】 【模板】可持久化线段树 1(主席树)

    Description 给定一个长度为 \(n\) 的序列, \(m\) 次操作静态查询区间第 \(k\) 大 Input 第一行是 \(n,m\) 下一行描述这个序列 下面 \(m\) 行描述操作 ...

  7. HDU 6070 二分+线段树

    Dirt Ratio Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Tot ...

  8. API Authentication Error: {"error":"invalid_client","message":"Client authentication failed"}

    解决方法:https://github.com/laravel/passport/issues/221 In your oauth_clients table, do the values you h ...

  9. dingo 内部调用获取异常信息

    $exception->getResponse(); $params = [ 'company_id' => $this->request->input('company_id ...

  10. 什么是Docker并且它为什么这么受欢迎

    什么是Docker (why it's so hot than hot) Docker是一个使用容器来方便快捷的创建,部署,运行程序的工具,容器允许开发人员将应用程序的一切打包(镜像),例如库和其他的 ...