1. 程式人生 > 其它 >java 設計模式之橋接模式(六)

java 設計模式之橋接模式(六)

技術標籤:Android設計模式java橋接模式

java 設計模式之橋接模式⑥

愛情是需要付出和捨得的,當你想要得到一份刻骨銘心的愛情時,你就必須作好承受刻骨銘心之苦的準備,否則,就不要輕易去嘗試。

設計模式學習,近期我會把23中設計模式都寫成部落格,敬請期待~

– 2021/1/9

什麼是橋接模式?

橋接模式,又叫橋樑模式,將抽象部分與它實現部分分離,使它們都可以獨立地變化。

百度百科

使用場景

當我們發現類有多層繼承時就可以考慮使用橋接模式,用聚合代替繼承。

舉例

來看看這張圖:

網路圖(1.1):


分析:

假設我們要去買電腦,電腦又分為:

  • 臺式電腦
  • 膝上型電腦
  • 平板電腦

臺式電腦又可以細分為聯想臺式,蘋果臺式等等,筆記本和平板也是一樣

如果正常思維寫程式碼是不是要把電腦類當做頂級的Base

然後臺式電腦,膝上型電腦,平板電腦分別繼承自電腦類

最後聯想臺式,蘋果臺式,戴爾臺式又分別繼承自臺式電腦…

那麼如果這麼寫的話有什麼問題?

他是不是會出現多繼承的關係,就是一層繼承一層,程式碼就會出現高度耦合性,導致程式碼不利於維護,而且你改一個地方,另一個地方很有可能衝突,

比如說我想改臺式電腦的顯示器,我改了一處地方,繼承他的子類就有可能有衝突問題.(這裡的子類指聯想臺式,蘋果臺式,戴爾臺式)

就拿聯想臺式來說:

  • 聯想是一個品牌
  • 電腦是一個產品

品牌和產品混合到個類中違反了單一職責原則

解決思路

網路圖(1.2):


如果這麼寫程式碼的話是不是就會好很多呢?

把蘋果,聯想,戴爾,歸到品牌

平板,筆記本,桌上型電腦歸到型別

如果我要蘋果桌上型電腦是不是紅框的位置(檢視網路圖(1.2))

如果我要聯想筆記本是不是藍框的位置(檢視網路圖(1.2))

如果我要蘋果平板是不是黑框的位置(檢視網路圖(1.2))


再以蘋果桌上型電腦來舉例:

網路圖(1.3):


桌上型電腦屬於型別,蘋果屬於品牌,連線他們的點就是橋

現在大家心裡是不是應該有解決的思路了呢?

吧品牌和型別單獨做成一個抽象類

然後蘋果,聯想,戴爾實現品牌類

平板筆記本臺式實現型別

然後通過組合的方式把他們組合到一起,這樣就實現了’橋’

程式碼實現

IBrand品牌類:

public abstract class ABrand {
   public abstract void info();
}

AType型別類:

public abstract class AType {
    public abstract void type();
}

接下來分別實現:

Dell(戴爾)是一個品牌,實現品牌:

public class Dell extends ABrand {
    @Override
    public void info() {
        Log.i("橋接模式","戴爾");
    }
}

Lenovo(聯想)是一個品牌,實現品牌:

public class Lenovo  extends ABrand {
    @Override
    public void info() {
        Log.i("橋接模式","聯想");
    }
}

Computer(電腦)是型別,實現AType,把品牌(ABrand)組合進來:

public class Computer extends AType {
    private ABrand brand;//相當於橋 品牌
    
    public Computer(ABrand brand) {
        this.brand = brand;
    }
    @Override
    public void type() {
        brand.info();
        Log.i("橋接模式:","電腦");
    }
}

Computer(筆記本)是型別,實現AType,把品牌(ABrand)組合進來:

public class Notebook extends AType {
    private ABrand brand;
    public Notebook(ABrand brand) {
        this.brand = brand;
    }
    @Override
    public void type() {
        brand.info();
        Log.i("橋接模式:","筆記本");
    }
}

使用程式碼(示例一):

 //電腦 品牌
Computer computer = new Computer(new Lenovo());
computer.type();

電腦裡面傳入聯想品牌,得到聯想電腦

Log圖(2.1):


使用程式碼(示例二):

//電腦 品牌
Computer computer = new Computer(new Lenovo());
computer.type();

Notebook notebook = new Notebook(new Dell());
notebook.type();

new 筆記本,傳入Dell品牌,得到戴爾筆記本!

Log圖(2.1):

總結

好處:

  • 橋接模式偶爾類似於多繼承,但多繼承違背了單一職責原則,複用性比較差,橋接模式極大的減少了子類的個數,從根本上維護了成本,降低了管理
  • 橋接模式滿足開閉原則(對擴充套件開放,對修改關閉),如果增加新的一個’緯度’比如說,雷神品牌,可以輕易的獲得雷神電腦,雷神筆記本等

缺點:

  • 橋接模式會增加程式碼的設計難度,聚合關係建立在抽象層,對開發者有一定的要求
  • 橋接模式適用於2個獨立的’緯度’(品牌和型別),有一定的侷限性

完整程式碼

設計模式/設計原則目錄

原創不易,您的點贊就是對我最大的支援,留下您的點贊吧~