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個獨立的’緯度’(品牌和型別),有一定的侷限性
原創不易,您的點贊就是對我最大的支援,留下您的點贊吧~