BRIDGE(橋接)—對象結構型模式

橋接模式【bridge】

  • 什麼是橋接模式
    將抽象部分於它的實現部分分離,使它們都可以獨立地變化,這個摘自<設計模式>的解釋,一般很難去理解,稍後我會以代碼加文字的形式給大家解釋清楚。

  • 什麼場景會用到橋接模式
    現在給大家一個場景,比如現在要做這樣一個功能,需求上描述,分別開發多個軟件應用,同時需要適應不同的系統,再詳細一點,比如,現在開發了一款購物app和閱讀app,需要兼容安卓和蘋果系統,這時候大家需要怎麼進行設計。
    大部分新手程序員在接觸到這個的時候可能第一時間想到的是繼承,通過繼承的方式去重寫父類的方法,類圖如下:
    初始類圖

就是父類有抽象方法,具體怎麼實現由子類去實現
在這裏插入圖片描述
就是父類是mobile,然後包含運行game和運行read的方法,由每個子類去實現,這樣就有了四種不同的實現,這麼設計的缺點在哪裏呢,第一就是每個app在安卓和蘋果系統裏面都需要一個子類,比如增加了一個英語學習app,就要分別去兩個系統裏面添加對應的子類,第二,如果需求改變,比如,需要增加華爲鴻蒙系統的兼容,那麼這個改變無疑是巨大的,並且如果系統裏面多100個要兼容的app,那麼就要去增加100個鴻蒙下面的子類,分別不同的實現。
這個時候橋接模式就可以好好利用起來了, 回顧一下橋接模式的概念。由於實現的方式有多種,橋接模式的核心意圖就是把這些實現獨立出來,讓他們各自的變化。這就使得每種實現的變化不會影響其他實現,從而達到應對變化的目的。讓我們把設計圖修改一下,以達到這個目的
在這裏插入圖片描述

代碼如下:
先定義一個Software接口:
public interface Software {

	void operate();
}

再寫它的兩個子類

public class Game implements Software   {

	@Override
	public void operate() {
		System.out.println("init game");
	}
	
}
public class Read implements Software {

	@Override
	public void operate() {
		System.out.println("init read");
	}

}

接着開始添加一個抽象類Mobile

public abstract class Mobile {
	
	private Software software;
	
	public Software getSoftware() {
		return software;
	}

	public void setSoftware(Software software) {
		this.software = software;
	}

	public abstract void run();
}

然後是它的兩個子類實現

public class IOS extends Mobile {

	@Override
	public void run() {
		System.out.println("IOS init..");
		getSoftware().operate();
	}

}
public class Android extends Mobile {

	@Override
	public void run() {
		System.out.println("Android init..");
		getSoftware().operate();
	}
}

從以上結構不難看出,若以後不管是添加新的操作系統還是添加新的app都不會相互影響,這就是鬆耦合

public static void main(String[] args) {
		Mobile mobile = new Android();
		mobile.setSoftware(new Game());
		mobile.run();
		mobile.setSoftware(new Read());
		mobile.run();
	}

現在回想起來,橋接模式這個概念是不是逐漸清晰了,說的通俗易懂一點就是,在我們現實場景中,系統可能按多種維度進行分類,每一種分類都可能發生變化,那麼就把這種多角度分類分離出來讓他們不相互依賴,減少它們之間的耦合。重點是理解如何將抽象化與現實化的脫耦的

相關參考:
<大話設計模式>,<設計模式,可複用面向對象軟件的基礎>
源碼在此

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章