結構型模式:橋接模式

LieBrother發表於2019-04-22

文章首發: 結構型模式:橋接模式

橋

七大結構型模式之二:橋接模式。

簡介

姓名 :橋接模式

英文名 :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 等教程 加個人微信備註『教程』獲取架構師、機器學習等教程

LieBrother

相關文章