JavaScript 23 種設計模式之 8 橋接模式

JavaScript 23 種設計模式之 8 橋接模式

概念與特點

概念:
使用組合關係代替繼承關係,減少子類數量。將抽象和實現分離,降低耦合度。

特點:

  1. 功能的拓展能力更強,系統更靈活。
  2. 實現細節透明化。

結構與實現

橋接模式包含抽象化類,拓展抽象化類,實現化類,具體實現化類。
抽象化類:定義一個抽象化類,其中包括一個抽象方法,一個對實現化類對象的引用。
拓展抽象化類:抽象化類的子類,實現抽象方法,通過組合關係調用實現化類的業務方法。
實現化類:定義實現化類的接口,供拓展抽象化類調用。
具體實現化類:實現化接口的具體實現。

小劇場:
小王的女盆友小花要過生日了。小王想自己準備蛋糕,小王知道女盆友喜歡喝果汁,所以想準備一個果汁蛋糕。但是小王不知道小花喜歡什麼樣的蛋糕,也不知道小花喜歡什麼樣的果汁。於是小王做了一個蛋糕模型。該模型可以將不同的果汁和不同類型的蛋糕任意組合成果汁蛋糕。小王做了以下事情。

  1. 先做一個抽象的蛋糕,只有奶油,並在蛋糕上留一個孔,可以注入不同的果汁。
  2. 然後塗上芝士,做一個芝士蛋糕,芝士蛋糕同樣可以抹上不同的果汁。
  3. 萬一不喜歡芝士蛋糕暱?再做一個草莓蛋糕,同樣的,可以直接在草莓蛋糕上抹上不同的果汁。
  4. 準備一杯抽象的果汁,只有榨汁杯和部分水。
  5. 切一點香蕉,做一杯香蕉汁。
  6. 萬一不喜歡香蕉汁暱?切一點蘋果,再做一杯蘋果汁。
  7. 取一杯香蕉汁,導入到芝士蛋糕裏,美味的香蕉芝士蛋糕就做好了。
<!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>

應用場景

  1. 一個類存在兩個以上獨立變化的維度,且這些類都要進行拓展。
  2. 多層次的繼承關係導致子類急劇增加。
  3. 抽象化類和具體化類之間想要增加更多的靈活性。

應用實例

暫無。

總結

橋接模式使用的場景主要是獨立的多個子類拓展性很強,就不適合使用繼承關係去實現業務。比如包包的分類維度有多種。按照功能有手提包、公文包、錢包等,按照顏色有白色、紅色、黃色等。這種情況下就可以在抽象層使用組合關係去實現而不是繼承關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章