JS设计模式——8.桥接模式
桥接模式的用途
在实现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连接队列
有待补充...