桥接模式的用途

在实现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. toast components

    toast components https://jossmac.github.io/react-toast-notifications/ https://docs.microsoft.com/en- ...

  2. Leetcode模拟题篇

    43. Multiply Strings 高精度非负整数的乘法. string multiply(string num1, string num2) { '); ; <= i; --i) { ; ...

  3. 【刷题】BZOJ 5008 方师傅的房子

    Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形 ,原点一定严格在凸多边形内部.有m个人也到了这个二维平面.现在你得到了m个 ...

  4. [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

    刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...

  5. shell实践(一)---判断远程服务器中文件是否存在

    1.判断一个文件的常见形式为 if [ -f filename ]  #此处有-e和-f的区别 注意: 1)中括号之间的空格: 2)filename最好是绝对路径,在判断远程服务器中文件是否存在时尤为 ...

  6. 解题:SCOI 2005 骑士精神

    题面 我把这个当做IDA*的模板题的说,说说我个人对IDA*的理解 IDA*是一个DFS,和A*一样,它也有一个乐观的估价函数.这里这个估价函数是用来限制状态的扩展的,如果当前代价加上乐观的估计都无法 ...

  7. AES-NI指令集

    对于intel的AES-NI新指令集,需要i5处理器及以上的相关硬件支持.在编译时,可能会出现 /usr/lib/gcc/x86_64-linux-gnu/4.8/include/wmmintrin. ...

  8. jenkins集成sonarqube代码审核

    目前在持续集成领域,除了后起之秀travis ci,在老牌工具中,最著名的还是非jenkins莫属.本篇文章简单的说一声jenkins与sonarqube的集成来实现代码的静态审核. 在这里不详细罗列 ...

  9. springboot 日期转化报错

    问题场景: 使用Springboot框架搭建服务,传日期参数json参数为2016-08-15 17:00:00这种格式,springboot中不能识别,将其转化为对象对应的日期属性.而是抛出异常信息 ...

  10. linq的语法和案例

    本篇逐一介绍linq各个关键字的用法(from,select,group,into等),本篇所有的案例都是用linqpad来完成的(官方地址:http://www.linqpad.net/),建议想学 ...