概念與特點
概念:
使用組合關係代替繼承關係,減少子類數量。將抽象和實現分離,降低耦合度。
特點:
- 功能的拓展能力更強,系統更靈活。
- 實現細節透明化。
結構與實現
橋接模式包含抽象化類,拓展抽象化類,實現化類,具體實現化類。
抽象化類:定義一個抽象化類,其中包括一個抽象方法,一個對實現化類對象的引用。
拓展抽象化類:抽象化類的子類,實現抽象方法,通過組合關係調用實現化類的業務方法。
實現化類:定義實現化類的接口,供拓展抽象化類調用。
具體實現化類:實現化接口的具體實現。
小劇場:
小王的女盆友小花要過生日了。小王想自己準備蛋糕,小王知道女盆友喜歡喝果汁,所以想準備一個果汁蛋糕。但是小王不知道小花喜歡什麼樣的蛋糕,也不知道小花喜歡什麼樣的果汁。於是小王做了一個蛋糕模型。該模型可以將不同的果汁和不同類型的蛋糕任意組合成果汁蛋糕。小王做了以下事情。
- 先做一個抽象的蛋糕,只有奶油,並在蛋糕上留一個孔,可以注入不同的果汁。
- 然後塗上芝士,做一個芝士蛋糕,芝士蛋糕同樣可以抹上不同的果汁。
- 萬一不喜歡芝士蛋糕暱?再做一個草莓蛋糕,同樣的,可以直接在草莓蛋糕上抹上不同的果汁。
- 準備一杯抽象的果汁,只有榨汁杯和部分水。
- 切一點香蕉,做一杯香蕉汁。
- 萬一不喜歡香蕉汁暱?切一點蘋果,再做一杯蘋果汁。
- 取一杯香蕉汁,導入到芝士蛋糕裏,美味的香蕉芝士蛋糕就做好了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//抽象化角色-蛋糕
class Cake{
//對果汁的引用
constructor(juice){
this.juice= juice;
}
//抽象方法-拿到蛋糕
getCake(){
}
}
//拓展抽象化角色-芝士蛋糕
class CheeseCake extends Cake{
constructor(juice){
super(juice);
}
getCake(){
//組合果汁和芝士蛋糕
return this.juice.getJuice()+ ' Cheese Cake'
}
}
//拓展抽象化角色-草莓蛋糕
class BerriesCake extends Cake{
getCake(){
//組合果汁和草莓蛋糕
return this.juice.getJuice()+ ' Berries Cake'
}
}
//實現化角色-果汁
class Juice{
getJuice(){
}
}
//具體實現化角色-香蕉汁
class BananaJuice extends Juice{
getJuice(){
return 'BananaJuice '
}
}
//具體實現化角色-蘋果汁
class AppleJuice extends Juice{
getJuice(){
return 'AppleJuice '
}
}
class PrepareCake{
static main(){
//取一杯香蕉汁
let bananaJuice = new BananaJuice();
//香蕉汁倒入芝士蛋糕中
let cheeseCake = new CheeseCake(bananaJuice);
//香蕉芝士蛋糕成型
let cake = cheeseCake.getCake();
console.log(cake)
}
}
PrepareCake.main();
</script>
</body>
</html>
應用場景
- 一個類存在兩個以上獨立變化的維度,且這些類都要進行拓展。
- 多層次的繼承關係導致子類急劇增加。
- 抽象化類和具體化類之間想要增加更多的靈活性。
應用實例
暫無。
總結
橋接模式使用的場景主要是獨立的多個子類拓展性很強,就不適合使用繼承關係去實現業務。比如包包的分類維度有多種。按照功能有手提包、公文包、錢包等,按照顏色有白色、紅色、黃色等。這種情況下就可以在抽象層使用組合關係去實現而不是繼承關係。