1. 程式人生 > 程式設計 >23種設計模式之橋接模式

23種設計模式之橋接模式

1、定義

將抽象部分和實現部分分離,使它們都可以獨立的變化。又稱為柄體(Handle and Body)模式或者介面(Interface)模式。

2、模式結構

橋接模式由四部分組成:

  • 抽象化(Abstraction)角色:抽象化給出的定義,並儲存一個對實現化物件的引用。
  • 修正抽象化(RefinedAbstraction)角色:擴充套件抽象化角色,改變和修正父類對抽象化的定義。
  • 實現化(Implementor)角色:這個角色給出實現化角色的介面,但不給出具體的實現。必須指出的是,這個介面不一定和抽象化角色的介面定義相同,實際上,這兩個介面可以非常不一樣。實現化角色應當只給出底層操作,而抽象化角色應當只給出基於底層操作的更高一層的操作。
  • 具體實現化(ConcreteImplementor)角色:這個角色給出實現化角色介面的具體實現。

3、例項

3.1 形狀類(抽象化角色)

public abstract class Shape {
    protected Color color;
    
    public Shape(Color color) {
        this.color = color;
    }
    
    public abstract void draw();
}
複製程式碼

3.2 修正抽象類角色

public class Circle extends Shape {
    
    public Circle(Color color) {
        super(color);
    }
    
    @Override
    public void draw
() { color.bepaint("圓形"); } } 複製程式碼
public class Rectangle extends Shape {

    public Rectangle(Color color) {
        super(color);
    }
    
    @Override
    public void draw() {
        color.bepaint("長方形");
    }
}
複製程式碼
public class Square extends Shape {

    public Square(Color color) {
        super(color);
    }
    
    @Override
    public void draw
() { color.bepaint("正方形"); } } 複製程式碼

3.3 顏色介面(抽象化角色)

public interface Color {
    public void bepaint(String shape);
}
複製程式碼

3.4 具體實現化角色

public class White implements Color {
    
    @Override
    public void bepaint(String shape) {
        System.out.println("白色的" + shape);
    }
}
複製程式碼
public class Black implements Color {
    
    @Override
    public void bepaint(String shape) {
        System.out.println("黑色的" + shape);
    }
}
複製程式碼

3.5 客戶端呼叫

public class Client {
    
    public static void main(String[] args) {
        Shape circle = new Circle(new White());
        circle.draw();
        
        Shape square = new Square(new Black());
        square.draw();
    }
}
複製程式碼

4、適用場景

  • 如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯絡,通過橋接模式可以使它們在抽象層建立一個關聯關係。
  • 抽象化角色和實現化角色可以以繼承的方式獨立擴充套件而互不影響,在程式執行時可以動態將一個抽象化子類的物件和一個實現化子類的物件進行組合,即系統需要對抽象化角色和實現化角色進行動態耦合。
  • 一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件。
  • 雖然在系統中繼承是沒有問題的,但是由於抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。
  • 對於那些不希望使用繼承或因為多層次繼承導致類的個數急劇增加的系統,橋接模式尤為適用。

5、在JDBC的原始碼分析

6、優缺點

6.1 優點
  • 分離抽象介面及其實現部分。橋接模式使用“物件間的關聯關係”解耦了抽象和實現之間固有的繫結關係,使得抽象和實現可以沿著各自的維度來變化。所謂抽象和實現沿著各自維度的變化,也就是說抽象和實現不再同一個繼承層次結構中,而是“子類化”它們,使它們各自都具有自己的子類,以便任何組合子類,從而獲得多維度組合物件。
  • 在很多情況下,橋接模式可以取代多層繼承方案,多層繼承方案違背看“單一職責原則”,複用性較差,且類的個數非常多,橋接模式是比多層繼承方案更好的解決方法,它極大減少了子類的個數。
  • 橋接模式提高了系統的可擴充套件性,在兩個變化維度中任意擴充套件一個維度,都不需要修改原有系統,符合“開閉原則”。
6.2 缺點
  • 橋接模式的使用會增加系統的理解與設計維度,由於關聯關係建立在抽象層,要求開發者一開始就針對抽象層進行設計與程式設計。
  • 橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用範圍具有一定的侷限性,如何正確識別兩個獨立維度也需要一定的經驗積累。

特別宣告:1、如若文中有錯之處,歡迎大神指出。 2、文章是參考網上一些大神的文章,自己整理出來的,如若有侵權,可聯絡我刪除。