DesignPattern - 橋接模式【結構型】

歡迎關注微信公衆號:FSA全棧行動 👋java

1、橋接模式介紹

橋接模式是一種結構型模式,將抽象部分與實現部分分離,使它們均可以獨立的變化,通俗來講,是經過組合來橋接其它的行爲/維度。數據庫

  • 應用場景
    • 系統須要在構件的抽象化角色和具體化角色之間增長更多的靈活性
    • 不想使用因繼承致使系統類的個數急劇增長的系統
    • 有時候一個類,可能會擁有多個變化維度,好比啤酒,有不一樣的容量和品牌,可使用繼承組合的方式進行開發,假如維度不少,就容易出現類的膨脹,使用橋接模式就能夠解決這個問題,且解耦
  • 優勢
    • 抽象和實現的分離
    • 優秀的擴展能力,符合開閉原則
  • 缺點
    • 增長系統的理解與設計難度
    • 使用聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計與編程,好比抽象類手機,裏面聚合了顏色類

補充:橋接模式用於設計的前期,精細化的設計,讓系統更加靈活編程

2、橋接模式代碼實現

一、舉例說明

在編碼以前,先舉個例子,手機有很規格,好比品牌、內存、機身顏色等等,那麼在設計數據庫表的時候,絕對不可能在 phone 表中用字段直接描述以上規格,就好比機身顏色來講,除了有常見的紅綠藍等顏色,還有相似 「亮黑」、「晴雪」、「墨羽」 等自定義的顏色,而且後期還可能重命名,可想而知,在 Phone 表中用一個字段來描述顏色維護性是有多差,更別說內存了(內存還分品牌、容量、帶寬...),這時把就得考慮把顏色單獨放一張 Color 表,兩表之間經過 外鍵關聯,之後無論是增長或重命名顏色,都很靈活。微信

表與表之間經過 外鍵關聯(通常是 Int 類型) 就是一種橋接模式,那麼在實際編碼中,通常是經過 組合 的方式實現這種橋接關係,即在 Phone 類中持有 Color 對象。另外,由於對象除了能夠描述屬性,還能夠有行爲方法,因此說,橋接模式能夠橋接其它的行爲/維度。markdown

二、代碼實現

建立 顏色接口,以及 具體顏色類:ide

/** * 顏色接口 * * @author GitLqr */
public interface IColor {
	String getColor();
}

public class BlueColor implements IColor {
	@Override
	public String getColor() {
		return "藍色";
	}
}

public class RedColor implements IColor {
	@Override
	public String getColor() {
		return "紅色";
	}
}
複製代碼

建立抽象角色手機類,持有 Color 對象:oop

/** * 抽象角色:手機 * * @author GitLqr */
public abstract class Phone {

	/** * 經過組合的方式來橋接其餘行爲 */
	protected IColor color;

	public void setColor(IColor color) {
		this.color = color;
	}

	/** * 手機的方法 */
	public abstract void run();
}
複製代碼

建立具體角色手機類:this

/** * 手機實例:小米手機 * * @author GitLqr */
public class MiPhone extends Phone {

	public MiPhone(IColor color) {
		this.setColor(color);
	}

	@Override
	public void run() {
		System.out.println(color.getColor() + "小米手機運行中...");
	}
}

/** * 手機實例:蘋果手機 * * @author GitLqr */
public class IPhone extends Phone {

	public IPhone(IColor color) {
		this.setColor(color);
	}

	@Override
	public void run() {
		System.out.println(color.getColor() + "蘋果手機運行中...");
	}
}
複製代碼

使用:編碼

public static void main(String[] args) {
    Phone miPhone = new MiPhone(new BlueColor());
    miPhone.run(); // 藍色小米手機運行中...

    Phone iPhone = new IPhone(new RedColor());
    iPhone.run(); // 紅色蘋果手機運行中...
}
複製代碼

若是文章對您有所幫助, 請不吝點擊關注一下個人微信公衆號:FSA全棧行動, 這將是對我最大的激勵. 公衆號不只有Android技術, 還有iOS, Python等文章, 可能有你想要了解的技能知識點哦~spa

相關文章
相關標籤/搜索