橋接模式(Bridge Pattern)

定義

將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。它是一種對象結(jié)構(gòu)型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模式。
橋接模式將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系,從而降低了類與類之間的耦合,減少了代碼編寫量。將類與類之間繼承的關(guān)系,變?yōu)槌橄箢惢蛘呓涌谂c接口之間的關(guān)聯(lián)關(guān)系,實現(xiàn)了抽象化與實現(xiàn)化的脫耦。

角色

  • 抽象化(Abstraction)角色:抽象化給出的定義,并保存一個對實現(xiàn)化對象的引用。
  • 修正抽象化(Refined Abstraction)角色:擴展抽象化角色,改變和修正父類對抽象化的定義。
  • 實現(xiàn)化(Implementor)角色:這個角色給出實現(xiàn)化角色的接口,但不給出具體的實現(xiàn)。必須指出的是,這個接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以非常不一樣。實現(xiàn)化角色應(yīng)當(dāng)只給出底層操作,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作。
  • 具體實現(xiàn)化(Concrete Implementor)角色:這個角色給出實現(xiàn)化角色接口的具體實現(xiàn)。

實例

抽象化角色

/**
 * @author Royle.Huang
 * @date 2018/12/30 11:54
 * @description: 抽象化角色 Abstraction 顏色接口
 */
public interface Color {
    void paint();
}

修正抽象化角色

/**
 * @author Royle.Huang
 * @date 2018/12/30 11:54
 * @description: 修正抽象化角色 Refined Abstraction
 */
public class Red implements Color{
    @Override
    public void paint() {
        System.out.print("red ");
    }
}
public class Bule implements Color {
    @Override
    public void paint() {
        System.out.print("blue ");
    }
}

實現(xiàn)化角色

/**
 * @author Royle.Huang
 * @date 2018/12/30 11:58
 * @description: 實現(xiàn)化角色 implementor 形狀
 */
public abstract class Shape {
    protected Color color;
    public Shape(Color color) {
        this.color = color;
    }
    abstract void draw();
}

具體實現(xiàn)化角色

/**
 * @author Royle.Huang
 * @date 2018/12/30 11:59
 * @description: 具體實現(xiàn)化角色 Concrete Implementor 圓
 */
public class Circle extends Shape {
    public Circle(Color color) {
        super(color);
    }

    @Override
    void draw() {
        color.paint();
        System.out.println("circle");
    }
}
/**
 * @author Royle.Huang
 * @date 2018/12/30 12:04
 * @description: 具體實現(xiàn)化角色
 */
public class Rectangle extends Shape {
    public Rectangle(Color color) {
        super(color);
    }

    @Override
    void draw() {
        color.paint();
        System.out.println("rectangle");
    }
}

測試代碼

public class Test {
    public static void main(String[] args) {
        Shape circle = new Circle(new Red());
        circle.draw();
    }
}

運行結(jié)果

red circle

使用場景

  1. 如果你不希望在抽象和實現(xiàn)部分采用固定的綁定關(guān)系,可以采用橋接模式,來把抽象和實現(xiàn)部分分開,然后在程序運行期間來動態(tài)的設(shè)置抽象部分需要用到的具體的實現(xiàn),還可以動態(tài)切換具體的實現(xiàn)。
  2. 如果出現(xiàn)抽象部分和實現(xiàn)部分都應(yīng)該可以擴展的情況,可以采用橋接模式,讓抽象部分和實現(xiàn)部分可以獨立的變化,從而可以靈活的進行單獨擴展,而不是攪在一起,擴展一邊會影響到另一邊。
  3. 如果希望實現(xiàn)部分的修改,不會對客戶產(chǎn)生影響,可以采用橋接模式,客戶是面向抽象的接口在運行,實現(xiàn)部分的修改,可以獨立于抽象部分,也就不會對客戶產(chǎn)生影響了,也可以說對客戶是透明的。
  4. 如果采用繼承的實現(xiàn)方案,會導(dǎo)致產(chǎn)生很多子類,對于這種情況,可以考慮采用橋接模式,分析功能變化的原因,看看是否能分離成不同的緯度,然后通過橋接模式來分離它們,從而減少子類的數(shù)目。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容