在系统中,某些类由于自身逻辑,具有两个或两个以上维度的变化,如何使得该类型可以沿多个方向变化,但又不引入额外的复杂度,这就是桥接模式要解决的问题。
定义:桥接模式(Bridge),将抽象部分与它的实现部分分离,使他们可以独立的变化。
意图:将抽象与实现解耦。
对于前端,比较常用的场景,是事件监控:
addEvent(element, 'click', getDrinkById); function getDrinkById(e) { var id = this.id; asyncRequest('GET', 'drink.uri?id=' + id, function(resp) { // callback response console.log('Requested drink:' + resp.responseText); }); }
但是上面代码有一个问题,就是getDrinkById必须有上下文,才能取得id,因为使用了this.id来取id.然后接着实现下面的逻辑,耦合过紧密。需要拆分:
function getDrinkById(id,callback) { asyncRequest('GET', 'drink.uri?id=' + id, function(resp) { // callback response callback(resp.responseText); }); } addEvent(element,'click',getDrinkByIdBridge); function getDrinkByIdBridge(e){ getDrinkById(this.id,function(drink){ console.log('Requested drink: '+ drink); }); }
从逻辑上分析,把id传给getDrinkById函数式合情理的,且响应结果总是通过一个回调函数返回。现在做的是针对接口而不是实现进行编程,用桥接模式把抽象隔离开来。
这样,明显代码模块话,各个部分代码功能明确,耦合性大大降低,将监听器方法抽取出来,成为一个单独的API函数,而且保证该API函数与节点本身没有必然的耦合,就可以独立的运行getDrinkById这个函数。
桥接模式,就是把给抽象与现实对象搭一座桥,让对象方法即联系在一起,又是独立变化的,让代码耦合性降低的一种设计模式。