結構型:橋接模式及相關應用
文章目錄
橋接(Bridge)
將抽象部分與它的具體實現部分分離,使它們都可以獨立地變化。
通過組合的方式建立兩個類之間聯絡,而不是繼承。
適用場景:
- 抽象和具體實現之間增加更多的靈活性。
- 一個類存在兩個(或多個)獨立變化的維度,且這兩個(或多個)維度都需要獨立進行擴充套件。
- 不希望使用繼承,或因為多層繼承導致系統類的個數劇增。
優缺點
優點:分離抽象部分及其具體實現部分;提高了系統的可擴充套件性;符合開閉原則與合成複用原則。
缺點:增加了系統的設計難度;需要正確地識別出系統中兩個獨立變化的維度。
應用場景
畫圖時可以畫正方形、長方形、圓形三種形狀,而每種形狀又可以畫白色、灰色、黑色三種顏色,因此我們可以很自然地想出以下的繼承關係:
對於這種方案,假如我們要新增一個橢圓形狀,我們又要增加三種顏色,也就是白橢圓、灰橢圓和黑橢圓。假如我們要新增一個綠色,我們就要增加綠正方形、綠橢圓和綠長方形。每次增加都會增加若干個類(如果增加顏色則會增加形狀個數個類,若增加形狀則會增加顏色個數個類),這會導致系統類的個數劇增,且不利於系統的擴充套件。
對於這種有幾個變化維度的場景,我們就可以使用橋接模式來減少系統中的類個數。這裡提供兩個父類一個是顏色、一個形狀,顏色父類和形狀父類兩個類都包含了相應的子類,然後根據需要對顏色和形狀進行組合:
形狀抽象類,將顏色介面設為其成員變數:
public abstract class Shape {
Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
具體形狀類:
public class Circle extends Shape{
public void draw() {
color.bepaint("圓形");
}
}
public class Rectangle extends Shape{
public void draw() {
color.bepaint("長方形");
}
}
public class Square extends Shape{
public void draw() {
color.bepaint("正方形");
}
}
顏色介面:
public interface Color {
public void bepaint(String shape);
}
具體顏色類:
public class White implements Color{
public void bepaint(String shape) {
System.out.println("白色的" + shape);
}
}
public class Gray implements Color{
public void bepaint(String shape) {
System.out.println("灰色的" + shape);
}
}
public class Black implements Color{
public void bepaint(String shape) {
System.out.println("黑色的" + shape);
}
}
客戶端類:
public class Test{
public static void main(String[] args) {
//白色
Color white = new White();
//正方形
Shape square = new Square();
//白色的正方形
square.setColor(white);
square.draw();
//長方形
Shape rectange = new Rectangle();
rectange.setColor(white);
rectange.draw();
}
}
這裡在實現時要注意,抽象類的方法要呼叫組合的實現類的方法(如類Square
中的color.bepaint("正方形")
這行程式碼),這樣才能體現出橋接的意義。
JDBC的應用
jdbc的類族設計是由sun公司設計了一套介面,再由各個資料庫公司實現介面,我們在呼叫的過程中只需要使用介面去定義,然後在載入Driver的過程中底層程式碼會給我們選擇好介面真正的實現類,以此來實現真正的資料庫連線,此後所有的方法,包括獲取statement等等,都是由介面宣告呼叫,但是底層返回的是介面實現類。用這種橋接的模式,我們可以很輕鬆地在不同的資料庫連線中進行轉化,只需要修改Driver載入的類,如果把載入類的宣告放入配置檔案中,更是不需要重新去編譯,可以很方便地在不同資料庫間進行轉化。
參考資料
- 弗里曼. Head First 設計模式 [M]. 中國電力出版社, 2007.
- 慕課網java設計模式精講 Debug 方式+記憶體分析
- 設計模式讀書筆記–橋接模式
- JDBC原始碼分析&橋接模式