天天看點

[設計模式] - 橋接模式一、橋接模式的簡介二、橋接模式的實作三、橋接模式的特點

文章目錄

  • 一、橋接模式的簡介
    • 1. 什麼是橋接模式
    • 2. 提出一個業務場景
    • 3. 傳統實作方式
      • (1) 建立Phone抽象類
      • (2) 建立具體手機品牌
      • (3) 編寫測試類
    • 4. 分析傳統方式的優劣勢
  • 二、橋接模式的實作
    • 1. 改寫既有代碼
      • (1) 抽離共有行為
      • (2) 建立行為實作類
      • (3) 建立實體抽象類
      • (4) 建立實體子類
      • (5) 測試
    • 2. 分析橋接模式設計思路
  • 三、橋接模式的特點
    • 1. 橋接模式的優缺點
    • 2. 橋接模式的使用場景
    • 3. 橋接模式在JDK中的使用

一、橋接模式的簡介

1. 什麼是橋接模式

橋接模式(Bridge) 又叫做柄體模式(handle and body),是結構性設計模式中的一種,他緻力于将代碼中抽象的部分與他的實作部分分離,達到他們都可以獨立變化的目的。

2. 提出一個業務場景

今天的小王準備開一家富土康代工廠,準備為華為,小米,錘子代工生産手機。由于每種手機都是使用的安卓系統,是以同時具備安卓系統的相同特性,比如開機,關機,打電話。那麼如果我們按照傳統的思維實作代工廠要如何做呢?

3. 傳統實作方式

我們先看下如果不适用橋接模式,我們需要如何實作這個業務。

(1) 建立Phone抽象類

public abstract class Phone {
	protected String brand;

	abstract void open();

	abstract void close();

	abstract void call();

}
           

(2) 建立具體手機品牌

由于子類實作相同,我這裡就隻貼出一個小米的代碼

public class XiaomiPhone extends Phone {

	@Override
	void open() {
		System.out.println("小米手機開機了");

	}

	@Override
	void close() {
		System.out.println("小米手機關機了");

	}

	@Override
	void call() {
		System.out.println("小米手機可以撥打電話");

	}

}
           

(3) 編寫測試類

public class Factory {

	public static void main(String[] args) {
		Phone phone = new XiaomiPhone();
		phone.call();
	}
}
           
[設計模式] - 橋接模式一、橋接模式的簡介二、橋接模式的實作三、橋接模式的特點

4. 分析傳統方式的優劣勢

我們通過上述的例子可以發現,由于三種手機應用的都是安卓系統,是以操作行為大體相同。但是傳統方式我們通過內建抽象類來實作這種複用業務每次都需要将重複的行為重新編碼,造成了代碼的備援。第二就是如果這些功能的重複部分如果因為系統更新而造成了改變,那麼我們就需要去每一個實作中修改相關方法的實作。那麼為了解決這個問題,橋接模式就派上用場了。

二、橋接模式的實作

1. 改寫既有代碼

(1) 抽離共有行為

public interface AndroidImplementor {
	void open();

	void close();

	void call();

}

           

(2) 建立行為實作類

public class AndroidConcreteImplementor implements AndroidImplementor{

	@Override
	public void open() {
		System.out.println("手機開機了");
		
	}

	@Override
	public void close() {
		System.out.println("手機關機了");
		
	}

	@Override
	public void call() {
		System.out.println("撥打電話");
		
	}

}

           

(3) 建立實體抽象類

public abstract class PhoneAbstranction {

	protected AndroidImplementor androidImplementor;

	abstract void open();

	abstract void close();

	abstract void call();

	// 限制子類必須擁有有參構造
	public PhoneAbstranction(AndroidImplementor androidImplementor) {
		super();
		this.androidImplementor = androidImplementor;
	}

}
           

(4) 建立實體子類

public class XiaomiPhoneRefinedAbstraction extends PhoneAbstranction {

	public XiaomiPhoneRefinedAbstraction(AndroidImplementor androidImplementor) {
		super(androidImplementor);
	}

	@Override
	void open() {
		super.androidImplementor.open();

	}

	@Override
	void close() {
		super.androidImplementor.close();

	}

	@Override
	void call() {
		super.androidImplementor.call();

	}

}
           

(5) 測試

public class Factory {

	public static void main(String[] args) {
		PhoneAbstranction phone = new XiaomiPhoneRefinedAbstraction(new AndroidConcreteImplementor());
		phone.call();
	}
}
           
[設計模式] - 橋接模式一、橋接模式的簡介二、橋接模式的實作三、橋接模式的特點

2. 分析橋接模式設計思路

[設計模式] - 橋接模式一、橋接模式的簡介二、橋接模式的實作三、橋接模式的特點

在介紹橋接模式的時候我說過橋接模式主要是為了将部分行為抽離出來,做到可以更加便捷的擴充維護。那麼為了達到這個目的,橋接模式主要分為了四部分:

  1. 行為的定義接口 implementor
  2. 行為的實作類 concreteImplementor
  3. 産品抽象類 abstraction
  4. 抽象類實作類 refinedAbstraction

三、橋接模式的特點

1. 橋接模式的優缺點

優點:

  1. 将産品與行為分離,可以讓系統在兩個維護進行拓展,提高了系統的擴容性。
  2. 實作對業務透明,對産品隐藏,解耦合。

缺點:

  1. 增加了系統複雜度
  2. 要求識别系統的兩個次元,對業務熟練度有要求

2. 橋接模式的使用場景

  1. 如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜态的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。
  2. 對于那些不希望使用繼承或因為多層次繼承導緻系統類的個數急劇增加的系統,橋接模式尤為适用。
  3. 一個類存在兩個獨立變化的次元,且這兩個次元都需要進行擴充。

3. 橋接模式在JDK中的使用

JDBC相關類的設計就是使用了橋接模式,使用橋接模式的目的是為了可以為不同的資料庫使用相同的拓展實作。

好了,今天的内容到此結束,如果還有疑問的同學可以私信我或在評論區留言,我會在第一時間為你解答。覺得有收獲的小夥伴請記得一鍵三連,關注部落客不要走丢,拒當白嫖黨~