文章首發: 結構型模式:橋接模式
七大結構型模式之二:橋接模式。
簡介
姓名 :橋接模式
英文名 :Bridge Pattern
價值觀 :解耦靠我
個人介紹 : Decouple an abstraction from its implementation so that the two can vary independently. 將抽象和實現解耦,使得兩者可以獨立地變化。 (來自《設計模式之禪》)
你要的故事
現在手機二分天下,安卓手機和蘋果手機目前佔有率高居 98.45%,其中安卓手機佔有率為 70.21%,蘋果手機佔有率為 28.24%,如下圖所示。
(資料從 netmarketshare 來)因為有這 2 個系統,所以很多軟體商都不得不開發 2 個系統的 APP。我們就拿這個案例來講,目前手機有安卓手機和蘋果手機,軟體有谷歌瀏覽器和火狐瀏覽器,通過手機開啟軟體這一過程來講講橋接模式。
從個人介紹可見,需要抽象化和實現化,然後使用橋接模式將抽象和實現解耦。
抽象化
:把一類物件共有的東西抽象到一個類裡面,該類作為這類物件的基類。在這裡我們可以抽象化的便是手機。
實現化
:將介面或抽象類的未實現的方法進行實現。在這裡我們可以實現化的就是軟體。
將抽象和實現解耦
:有了上面的抽象化和實現化,通過橋接模式來實現解耦。在這裡,我們把開啟軟體 open()
放到軟體實現中,而抽象的手機利用模板方法模式定義 openSoftware()
供手機子類去實現,手機子類也是呼叫軟體的 open()
方法,並沒有自己實現開啟邏輯,也就是解耦了這個開啟軟體過程。
下面給出案例的程式碼。
Phone 手機抽象類程式碼。屬性 system
代表系統名稱,software
代表要開啟的軟體,openSoftware()
對外提供開啟軟體的方法。
abstract class Phone {
private String system;
private Software software;
public abstract void openSoftware();
public String getSystem() {
return system;
}
public void setSystem(String system) {
this.system = system;
}
public Software getSoftware() {
return software;
}
public void setSoftware(Software software) {
this.software = software;
}
}
複製程式碼
AndroidPhone 安卓系統手機程式碼。
class AndroidPhone extends Phone {
public AndroidPhone(Software software){
this.setSystem("Android");
this.setSoftware(software);
}
@Override
public void openSoftware() {
this.getSoftware().open(this);
}
}
複製程式碼
IOSPhone IOS 系統手機程式碼(也就是蘋果手機)。
class IOSPhone extends Phone {
public IOSPhone(Software software) {
this.setSystem("IOS");
this.setSoftware(software);
}
@Override
public void openSoftware() {
this.getSoftware().open(this);
}
}
複製程式碼
Software 軟體介面程式碼。它有一個方法 open(),用於開啟該軟體。
interface Software {
void open(Phone phone);
}
複製程式碼
Chrome 谷歌瀏覽器軟體程式碼。
class Chrome implements Software {
@Override
public void open(Phone phone) {
System.out.println("開啟 " + phone.getSystem() + " 手機的 Chrome 瀏覽器");
}
}
複製程式碼
FireFox 火狐瀏覽器軟體程式碼。
class FireFox implements Software {
@Override
public void open(Phone phone) {
System.out.println("開啟 " + phone.getSystem() + " 手機的 Firefox 瀏覽器");
}
}
複製程式碼
測試程式碼如下。
public class BridgeTest {
public static void main(String[] args) {
Software chrome = new Chrome();
Software firefox = new FireFox();
Phone androidPhone = new AndroidPhone(chrome);
androidPhone.openSoftware();
androidPhone.setSoftware(firefox);
androidPhone.openSoftware();
Phone iosPhone = new IOSPhone(chrome);
iosPhone.openSoftware();
iosPhone.setSoftware(firefox);
iosPhone.openSoftware();
}
}
列印結果:
開啟 Android 手機的 Chrome 瀏覽器
開啟 Android 手機的 Firefox 瀏覽器
開啟 IOS 手機的 Chrome 瀏覽器
開啟 IOS 手機的 Firefox 瀏覽器
複製程式碼
橋接模式程式碼已經寫完。為什麼叫橋接模式呢?因為它將開啟軟體的具體實現放到了軟體實現裡面,而不是放在了手機,通過聚合方式去呼叫軟體開啟的方法,這就像一條橋一樣連線手機和軟體。
總結
橋接模式利用了聚合的優點去解決繼承的缺點,使得抽象和實現進行分離解耦。正由於解耦,使得有更好的擴充套件性,加手機型別或者加軟體都非常容易,也不會破壞原有的程式碼。
推薦閱讀
公眾號後臺回覆『大禮包』獲取 Java、Python、IOS 等教程 加個人微信備註『教程』獲取架構師、機器學習等教程