1. 程式人生 > >結構型:橋接模式及相關應用

結構型:橋接模式及相關應用

文章目錄


橋接(Bridge)

將抽象部分與它的具體實現部分分離,使它們都可以獨立地變化。

通過組合的方式建立兩個類之間聯絡,而不是繼承。

適用場景:

  • 抽象和具體實現之間增加更多的靈活性。
  • 一個類存在兩個(或多個)獨立變化的維度,且這兩個(或多個)維度都需要獨立進行擴充套件。
  • 不希望使用繼承,或因為多層繼承導致系統類的個數劇增。

優缺點

優點:分離抽象部分及其具體實現部分;提高了系統的可擴充套件性;符合開閉原則與合成複用原則。

缺點:增加了系統的設計難度;需要正確地識別出系統中兩個獨立變化的維度。

應用場景

畫圖時可以畫正方形、長方形、圓形三種形狀,而每種形狀又可以畫白色、灰色、黑色三種顏色,因此我們可以很自然地想出以下的繼承關係:

1

對於這種方案,假如我們要新增一個橢圓形狀,我們又要增加三種顏色,也就是白橢圓、灰橢圓和黑橢圓。假如我們要新增一個綠色,我們就要增加綠正方形、綠橢圓和綠長方形。每次增加都會增加若干個類(如果增加顏色則會增加形狀個數個類,若增加形狀則會增加顏色個數個類),這會導致系統類的個數劇增,且不利於系統的擴充套件。

對於這種有幾個變化維度的場景,我們就可以使用橋接模式來減少系統中的類個數。這裡提供兩個父類一個是顏色、一個形狀,顏色父類和形狀父類兩個類都包含了相應的子類,然後根據需要對顏色和形狀進行組合:

2

形狀抽象類,將顏色介面設為其成員變數:


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載入的類,如果把載入類的宣告放入配置檔案中,更是不需要重新去編譯,可以很方便地在不同資料庫間進行轉化。

參考資料