設計模式,寫代碼必備神器...
橋接模式是什麼?
橋接模式是把抽象化和實作化解耦,讓兩者可以獨立,該設計模式屬于結構性設計模式。何為将抽象化和實作化解耦,可以了解為将功能點抽象出來,功能的實作如何取決于不同的需求,但是抽象的功能點(接口)已經被橋接到原本的類型上,隻用關注與實作。原本的類型變化,和抽象的功能點可以自由變化,中間的橋梁已經搭建起來了。
橋接模式其實就是不單單使用類繼承的方式,而是重點使用類聚合的方式,進行橋接,把抽象的功能點,聚合(注入)到基類裡面。
橋接模式的好處
一般用于解決什麼問題呢?
主要是功能點實作種類多,多個次元的功能點,獨立變化,沒有什麼關聯,可以按照次元來管理。比如有 2 個次元,每個次元有 3 種實作,但是不同的次元之間其實沒有關聯,如果按照次元之間兩兩關聯來搞,單單是實作類的數量就已經
2 * 3 = 6
個類了,是在不太合适,還耦合在一塊。
用電腦舉個例子,既會分成不同的品牌,比如戴爾,聯想,又會分為桌上型電腦,筆記本,那麼不同的類就會很多,功能可能比較重複。正是鑒于這一點,我們得剝離重複的功能,用橋接的方式,來維護抽象出來的共同功能點。
如果再新增一個品牌,比如,華碩,那麼又得增加兩個類,這明顯不太合适,不同的類很多功能可能會重複。
那麼橋接模式怎麼處理呢?橋接模式把兩個不同的次元 桌上型電腦 和 筆記本抽取出來,相當于作為一個通用的屬性來維護。
代碼Demo示範
首先,定義一個抽象的電腦類
AbstractComputer
,在其中有一個屬性是
ComputerType
,表示電腦的類型:
public abstract class AbstractComputer {
protected ComputerType type;
public void setType(ComputerType type) {
this.type = type;
}
public abstract void work();
}
再定義三種類型的電腦:
LenovoComputer
,
AsusComputer
DellComputer
:
public class LenovoComputer extends AbstractComputer{
@Override
public void work() {
System.out.print("聯想");
type.feature();
}
}
public class AsusComputer extends AbstractComputer{
@Override
public void work() {
System.out.print("華碩");
type.feature();
}
}
public class DellComputer extends AbstractComputer{
@Override
public void work() {
System.out.print("戴爾");
type.feature();
}
}
電腦類型這個次元同樣需要一個抽象類
ComputerType
,裡面有一個說明功能的方法
feature()
public abstract class ComputerType {
// 功能特性
public abstract void feature();
}
電腦類型這個次元,我們定義桌上型電腦和筆記本電腦兩種:
public class DesktopComputerType extends ComputerType{
@Override
public void feature() {
System.out.println(" 桌上型電腦:性能強大,拓展性強");
}
}
public class LaptopComputerType extends ComputerType{
@Override
public void feature() {
System.out.println(" 筆記本電腦:小巧便攜,辦公不在話下");
}
}
測試一下,我們需要不同的搭配的時候,隻需要将一個次元
set
到對象中去即可,就可以聚合出不同品牌不同類型的電腦:
public class BridgeTest {
public static void main(String[] args) {
ComputerType desktop = new DesktopComputerType();
LenovoComputer lenovoComputer = new LenovoComputer();
lenovoComputer.setType(desktop);
lenovoComputer.work();
ComputerType laptop = new LaptopComputerType();
DellComputer dellComputer = new DellComputer();
dellComputer.setType(laptop);
dellComputer.work();
}
}
測試結果:
聯想 桌上型電腦:性能強大,拓展性強
戴爾 筆記本電腦:小巧便攜,辦公不在話下
總結一下
橋接模式,本質上就是将不同次元或者說功能,抽象出來,作為屬性,聚合到對象裡面,而不是通過繼承。這樣一定程度上減少了類的數量,但是如果不同的次元之間,變化是相關聯的,這樣使用起來還需要再做各種特殊判斷,使用起來容易造成混亂,不宜使用。(重點:用組合/聚合關系代替繼承關系來實作)
JDBC
,搞過
Java
的同學應該都知道,這是一種
Java
統一通路資料庫的
API
,可以操作
Mysql
Oracle
等,主要用到的設計模式也是橋接模式,有興趣可以了解一下
Driver
驅動類管理的源碼。
【作者簡介】:
秦懷,公衆号【秦懷雜貨店】作者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。個人寫作方向:
Java源碼解析
,
JDBC
Mybatis
Spring
redis
分布式
劍指Offer
LeetCode
等,認真寫好每一篇文章,不喜歡标題黨,不喜歡花裡胡哨,大多寫系列文章,不能保證我寫的都完全正确,但是我保證所寫的均經過實踐或者查找資料。遺漏或者錯誤之處,還望指正。
劍指Offer全部題解PDF
開源程式設計筆記