結構型模式:橋接模式

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

橋

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

簡介

姓名 :橋接模式chrome

英文名 :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。咱們就拿這個案例來說,目前手機有安卓手機和蘋果手機,軟件有谷歌瀏覽器和火狐瀏覽器,經過手機打開軟件這一過程來說講橋接模式。ide

從我的介紹可見,須要抽象化和實現化,而後使用橋接模式將抽象和實現解耦。學習

抽象化:把一類對象共有的東西抽象到一個類裏面,該類做爲這類對象的基類。在這裏咱們能夠抽象化的即是手機

實現化:將接口或抽象類的未實現的方法進行實現。在這裏咱們能夠實現化的就是軟件

將抽象和實現解耦:有了上面的抽象化和實現化,經過橋接模式來實現解耦。在這裏,咱們把打開軟件 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

相關文章
相關標籤/搜索