橋接模式【結構型模式】

文章優先發表在個人博客:https://www.xdx97.com/article/705731339978014720

1、引出橋接模式

我們有一個手機產品,手機下面有多個類型(直板、翻蓋),每個手機有多個生產商(小米、華爲)。

我們可以按照下圖的思路去構建出來我們的代碼

在這裏插入圖片描述

總結

  • 如果我們新增一個翻蓋類型手機,那麼我們就會新增三個類。(翻蓋、小米、華爲)
  • 如果我們再新增一個一加手機,那麼我們在每個類型下面都會再新增一個一加手機
  • 這樣就會導致類爆炸。我們使用橋接模式去解決這個問題。



2、橋接模式

2-1、基本概念

橋接模式:是一種結構型模式,將實現與抽象放在兩個不同的類層次中,使兩個層次可以獨立改變。

橋接模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行爲讓不同的類承擔不同的職責。它的主要特點是把抽象與行爲實現分離開來,從而可以保持各部分的獨立性以及應對他們的功能擴展。

在這裏插入圖片描述

1、Brand (品牌接口)

// 品牌
public interface Brand {

    // 打電話
    void call();

    // 發消息
    void sendMessage();
}

2、小米

public class XiaoMi implements Brand {

    @Override
    public void call() {
        System.out.println("打電話 - 小米");
    }

    @Override
    public void sendMessage() {
        System.out.println("發消息 - 小米");
    }
}

3、華爲

public class HuaWei implements Brand {

    @Override
    public void call() {
        System.out.println("打電話 - 華爲");
    }

    @Override
    public void sendMessage() {
        System.out.println("發消息 - 華爲");
    }
}

4、手機 (抽象類)

public abstract class Phone {
    
    // 通過組合的方式去調用具體的手機(小米 / 華爲)
    private Brand brand;

    Phone (Brand brand){
        this.brand = brand;
    }

    // 打電話
    protected void call(){
        brand.call();
    }

    // 發消息
    protected void sendMessage(){
        brand.sendMessage();
    }
}

5、直板手機

public class StraightBoard extends Phone {

    StraightBoard(Brand brand) {
        super(brand);
    }

    // 打電話
    @Override
    public void call(){
        System.out.print("直板手機   ");
        super.call();
    }

    // 發消息
    @Override
    public void sendMessage(){
        System.out.print("直板手機   ");
        super.sendMessage();
    }
}

6、翻蓋手機

public class FlipOver extends Phone {

    FlipOver(Brand brand) {
        super(brand);
    }

    // 打電話
    @Override
    public void call(){
        System.out.print("翻蓋手機   ");
        super.call();
    }

    // 發消息
    @Override
    public void sendMessage(){
        System.out.print("翻蓋手機   ");
        super.sendMessage();
    }
}

測試

public class Main {
    public static void main(String[] args) {
        
        // 直板小米手機
        StraightBoard xiaoMi1 = new StraightBoard(new XiaoMi());
        xiaoMi1.call();
        xiaoMi1.sendMessage();

        // 直板華爲手機
        StraightBoard huaWei1 = new StraightBoard(new HuaWei());
        huaWei1.call();
        huaWei1.sendMessage();

        // 翻蓋小米手機
        FlipOver xiaoMi2 = new FlipOver(new XiaoMi());
        xiaoMi2.call();
        xiaoMi2.sendMessage();

        // 翻蓋華爲手機
        FlipOver huaWei2 = new FlipOver(new HuaWei());
        huaWei2.call();
        huaWei2.sendMessage();

//        直板手機   打電話 - 小米
//        直板手機   發消息 - 小米
//        直板手機   打電話 - 華爲
//        直板手機   發消息 - 華爲
//        翻蓋手機   打電話 - 小米
//        翻蓋手機   發消息 - 小米
//        翻蓋手機   打電話 - 華爲
//        翻蓋手機   發消息 - 華爲
    }
}


總結

  • 假如我們使用最開始的做法。有M個手機類型,N個手機廠商,那麼最後的類個數 = N*M
  • 而我們使用橋接模式,同樣的M個手機類型,N個手機廠商,最後的類個數 = N + M
  • 橋接模式我們要找到關鍵的兩點:實現抽象

在這裏插入圖片描述

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