適用場合及栗子
- 事件監(jiān)聽器
假設(shè)有一個名為getBeerById的API函數(shù)。它根據(jù)一個標識符返回有關(guān)某種啤酒的信息树枫。我們來給一個事件監(jiān)聽用戶操作
//bad
addEvent(Element,'click',getBeerById)
function getBeerById(e){
// 事件對象被作為參數(shù)傳遞給函數(shù),而本例并沒有使用這個參數(shù)景东,只是從this對象中獲取id
var id = this.id;
asyncRequest('GET',`beer.uri?id=${id}`,function (res) {
console.log(`Request Beer:${res.responseText}`)
})
}
// good
function getBeerById(id,callback) {
asyncRequest('GET',`beer.uri?id=${id}`,function (res) {
// 回調(diào) 傳入返回值
callback(res.responseText)
})
}
addEvent(Element,'click',getBeerByIdBridge)
function getBeerByIdBridge(e){
// 把id作為參數(shù)傳遞給getBeerById函數(shù)是合情合理的团赏,這里使用一個回調(diào)函數(shù)把回應(yīng)結(jié)果返回 現(xiàn)在我們將針對接口而不是實現(xiàn)進行編程
getBeerById(this.id,function (beer) {
console.log(`Request Beer:${res.responseText}`)
})
}
我們用了兩種方式來實現(xiàn),第一種方式把事件對象與getBeerById捆綁在一起耐薯,那么它只在本次事件中適用舔清。第二種方式使用橋接模式把抽象隔離開來后丝里,getBeerById 函數(shù)不再和事件對象捆綁在一起,也就擴大了它的適用范圍
- 特權(quán)函數(shù)
var Public = function () {
var secret = 3;
this.privilegedGetter = function () {
return secret
}
}
var o = new Public();
var data = o.privilegedGetter();
利用橋接函數(shù)來實現(xiàn)公共成員對私有成員的訪問和操作 詳見封裝
- 連接多個類
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 clsaa2(d);
}
這看起來很像適配器体谒,但是本例中實際上并沒有客戶系統(tǒng)要求提供數(shù)據(jù)杯聚,它只不過是用來接納數(shù)據(jù)并轉(zhuǎn)發(fā)給責任方的一種輔助性手段。
有人可能會覺得這個橋接類實際上就是一個門面類抒痒。但是這里與門面類不同幌绍,使用橋接模式是為了讓class1和class2能夠獨立于BrigeClass而發(fā)生改變。
總結(jié)
橋接模式主要的作用是將抽象與其實現(xiàn)隔離開來故响,以便二者獨立變化傀广,互不影響。
橋接模式的好處就在于能夠獨立管理你項目的各個組成部分彩届,可以促進代碼的模塊化伪冰,促成更簡潔的實現(xiàn)并提高抽象的靈活性。
只有某一處調(diào)用的函數(shù)如果用橋接的話樟蠕,代碼就會變得累贅了贮聂。而且增加了函數(shù)的調(diào)用,可能會對性能造成一些影響寨辩。