桥接模式
桥接模式的作用在于“将抽象与其实现隔离开来,以便二者独立变化”。这种模式对于javascript中常见的事件驱动编程大有裨益。
桥接模式最常见和实际的应用场合之一就是事件监听器的回调函数。
假设有一个名为getUserById的函数,它根据一个标识符返回某个用户的信息,在web程序中,可能希望用户执行某种操作(例如点击一个button)的时候获取信息。而被点击的元素很有可能具有这个标识符信息,例如button具有id属性。
下面是一种做法:
addEventListener(element,click,getUserById);
function getUserById(e){
var id=this.id;
asyncRequest(“GET”,”user.uri?id=”+id,function(res){
//处理结果
});
}
可以看出,这段API只能工作在浏览器中。如果要对这段代码做单元测试,或者在命令行中执行,那就非常不便。一个良好的API不能与特定的实现搅在一起。
下面是改进:
function getUserById(id,callback){
asynRequest(“GET”,”user.uri?id=”+id,function(res){
callback(res);
});
} //这个版本会实用得多!
此时想要在web中使用也很简单:
addEvent(element,’click’,getUserByIdBridge);
function getUserByIdBridge(e){
getUserById(this.id,function(user){
console.log(user);
});
}
上面这层桥接元素将公开的API和具体实现隔离开来,这样也使得API的适用范围大大扩宽了。
从类的角度来看,意味着把接口作为公开的代码编写,把类的实现作为私有代码编写。
现实生活中用桥梁连接多个事物,js中也是如此。
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);
}
看起来桥接元素只是为了方便,实际上它扮演的就是一个门面类的角色。但是,这里使用桥接模式的目的是为了让Class1和Class2能够独立于BrigdeClass而改变,这与门面类是不同的!说到底,桥接元素应该是粘合每一个抽象的粘合因子。