文章首發:
結構型模式:橋接模式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 等教程
加我的微信備註『教程』獲取架構師、機器學習等教程