桥接模式可以把抽象类和实现类进行各自封装和扩展,目的在于解耦。
由于桥接模式可以增强了组合性,我们可以很灵活地修改类,并且很好地重用。
我们可以先看一下简单的片断:
//这是一个演示简单的桥接模式片断(本例子只假设在标准浏览器情况下)
//先获取DOM
var DomA = document.getElementById('divA');
//给DomA绑定事件
DomA.addEventListener('click',funcA,false);
//定义funcA
function funcA(){
var id = this.id;
alert("I'm HTMLElement, My ID is:" + id);
}
以上的例子很简单,就是把一个DOM绑定了click事件,执行一个含有alert()的函数。
很明显,funcA能做的事只有两件:
1、获得元素的ID。
2、显示I'm HTMLElement, My ID is: divA。
funcA就是所谓的“写死”了,也就是强耦合,里面的alert()永远只是服务于funcA,大大失去了灵活性。
现在我们用桥接模式的思想,把funcA拆分,解耦。
//这是一个演示简单的桥接模式片断(本例子只假设在标准浏览器情况下)
//先获取DOM
var DomA = document.getElementById('divA');
//给DomA绑定事件
DomA.addEventListener('click',funcA,false);
//这里把上例的funcA进行拆分出一个funcAlert
function funcAlert(txt,id){
alert(txt+id);
}
//定义funcA
function funcA(){
var id = this.id;
//桥接funcAlert函数
funcAlert("I'm HTMLElement ,My ID is:",id);
}
好了,以后funcAlert()就可以作用于其他函数,只要给funcALert(),传入参数即可。
当然,本例只是为了演示而做了一个比较简单的拆分。er......看起来有点无谓。
不管如何,只是表达了桥接的思想。
其实就是把多个功能尽量拆分,解耦,做到可重用,然后在使用时,再拼装起来。将抽象部分与它的实现部分分离,使它们都可以独立变化,重用。就这是桥接模式的思想。
还记得我在分享单体模式吗?里面有一个这样的片断:
var XZB = (function(){
var G = 10;
var Return = {
getG:function(){
return G;
},
setG:function(g){
G = g;
}
}
return Return;
})();
其实里面的Return也是一种解耦,只不过他的耦合度相对低一点而已。
里面的Return可以设定有N种方法来实现N种功能,只不过他们都只局限于操作里面的私有变量。
OK,讲完了桥装模式,我们来讲讲他的优缺点:
优点:
降低抽象层和具体实现之间的耦合,使各层独立出来管理。桥接模式成了各层的粘合剂。
缺点:
因为每个桥接都会调用外层的函数,这就需要往上搜索变量,会有性能上的影响。
还有一点,如果被桥接的函数只是在于桥接函数里面调用,而再也没被其他函数调用,这时就没必要桥接了。
写在最后,看完这个桥接模式之后,有没发现和我之前写的工厂模式有点相似,难道工厂模式就只是多了判断,然后选择性调用吗?
er...我也说不清,总言之,我觉得设计模式只是实现功能的代码写法,也并不是说什么功能就应该用什么模式,灵活运用才是王道。