桥接模式可以把抽象类和实现类进行各自封装和扩展,目的在于解耦。
由于桥接模式可以增强了组合性,我们可以很灵活地修改类,并且很好地重用。我们可以先看一下简单的片断://这是一个演示简单的桥接模式片断(本例子只假设在标准浏览器情况下) //先获取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...我也说不清,总言之,我觉得设计模式只是实现功能的代码写法,也并不是说什么功能就应该用什么模式,灵活运用才是王道。