文章首發: "結構型模式:橋接模式" 七大結構型模式之二:橋接模式。 簡介 姓名 :橋接模式 英文名 :Bridge Pattern 價值觀 :解耦靠我 個人介紹 : Decouple an abstraction from its implementation so that the two ca ...
文章首發:
結構型模式:橋接模式
七大結構型模式之二:橋接模式。
簡介
姓名 :橋接模式
英文名 :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 等教程
加個人微信備註『教程』獲取架構師、機器學習等教程