橋接模式【bridge】
-
什麼是橋接模式
將抽象部分於它的實現部分分離,使它們都可以獨立地變化,這個摘自<設計模式>的解釋,一般很難去理解,稍後我會以代碼加文字的形式給大家解釋清楚。 -
什麼場景會用到橋接模式
現在給大家一個場景,比如現在要做這樣一個功能,需求上描述,分別開發多個軟件應用,同時需要適應不同的系統,再詳細一點,比如,現在開發了一款購物app和閱讀app,需要兼容安卓和蘋果系統,這時候大家需要怎麼進行設計。
大部分新手程序員在接觸到這個的時候可能第一時間想到的是繼承,通過繼承的方式去重寫父類的方法,類圖如下:
就是父類有抽象方法,具體怎麼實現由子類去實現
就是父類是mobile,然後包含運行game和運行read的方法,由每個子類去實現,這樣就有了四種不同的實現,這麼設計的缺點在哪裏呢,第一就是每個app在安卓和蘋果系統裏面都需要一個子類,比如增加了一個英語學習app,就要分別去兩個系統裏面添加對應的子類,第二,如果需求改變,比如,需要增加華爲鴻蒙系統的兼容,那麼這個改變無疑是巨大的,並且如果系統裏面多100個要兼容的app,那麼就要去增加100個鴻蒙下面的子類,分別不同的實現。
這個時候橋接模式就可以好好利用起來了, 回顧一下橋接模式的概念。由於實現的方式有多種,橋接模式的核心意圖就是把這些實現獨立出來,讓他們各自的變化。這就使得每種實現的變化不會影響其他實現,從而達到應對變化的目的。讓我們把設計圖修改一下,以達到這個目的
代碼如下:
先定義一個Software接口:
public interface Software {
void operate();
}
再寫它的兩個子類
public class Game implements Software {
@Override
public void operate() {
System.out.println("init game");
}
}
public class Read implements Software {
@Override
public void operate() {
System.out.println("init read");
}
}
接着開始添加一個抽象類Mobile
public abstract class Mobile {
private Software software;
public Software getSoftware() {
return software;
}
public void setSoftware(Software software) {
this.software = software;
}
public abstract void run();
}
然後是它的兩個子類實現
public class IOS extends Mobile {
@Override
public void run() {
System.out.println("IOS init..");
getSoftware().operate();
}
}
public class Android extends Mobile {
@Override
public void run() {
System.out.println("Android init..");
getSoftware().operate();
}
}
從以上結構不難看出,若以後不管是添加新的操作系統還是添加新的app都不會相互影響,這就是鬆耦合
public static void main(String[] args) {
Mobile mobile = new Android();
mobile.setSoftware(new Game());
mobile.run();
mobile.setSoftware(new Read());
mobile.run();
}
現在回想起來,橋接模式這個概念是不是逐漸清晰了,說的通俗易懂一點就是,在我們現實場景中,系統可能按多種維度進行分類,每一種分類都可能發生變化,那麼就把這種多角度分類分離出來讓他們不相互依賴,減少它們之間的耦合。重點是理解如何將抽象化與現實化的脫耦的。
相關參考:
<大話設計模式>,<設計模式,可複用面向對象軟件的基礎>
源碼在此