橋接模式究竟是如何進行橋接的呢?

橋接模式

今天我們繼續學習 23 種設計模式中的第七種——橋接模式。所謂橋接模式就是將抽象部分和實現部分隔離開來,使得它們能夠獨立變化。橋接模式將繼承關係轉化成關聯關係,封裝了變化,完成了解耦,減少了系統中類的數量,也減少了代碼量。

概念:

橋接模式是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。

如果說某個系統能夠從多個角度來進行分類,且每一種分類都可能會變化,那麼我們需要做的就是將這多個角度分離出來,使得它們能獨立變化,減少他們之間的耦合,這個分離過程就使用了橋接模式。

特點:

優點

  • 抽象與實現分離,所以擴展性好
  • 實現細節對客戶透明

缺點:

  • 由於聚合關係建立在抽象層,要求開發者針對抽象層進行設計與編程,這增加了系統的理解與設計難度。
類圖分析:

image-20200408151458979

代碼:

手機品牌接口

package cn.ppdxzz.bridge;
/**
 * Description:手機品牌接口
 * @Author: PeiChen JavaAnything
 */
public interface Brand {
    void open();   //開機
    void call();   //打電話
    void close();  //關機
}

OPPO品牌的手機

package cn.ppdxzz.bridge;
/**
 * Description:OPPO品牌的手機
 * @Author: PeiChen JavaAnything
 */
public class Oppo implements Brand {
    @Override
    public void open() {
        System.out.println("oppo手機開機");
    }

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

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

vivo品牌的手機

package cn.ppdxzz.bridge;
/**
 * Description:vivo品牌的手機
 * @Author: PeiChen JavaAnything
 */
public class Vivo implements Brand {
    @Override
    public void open() {
        System.out.println("vivo手機開機");
    }

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

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

手機抽象類

package cn.ppdxzz.bridge;
/**
 * Description:手機抽象類
 * @Author: PeiChen JavaAnything
 */
public abstract class Phone {

    //品牌注入到手機中
    private Brand brand;

    public Phone() {
    }
    public Phone(Brand brand) {
        this.brand = brand;
    }

    protected void open() {
        brand.open();
    }
    protected void call() {
        brand.call();
    }
    protected void close() {
        brand.close();
    }

}

觸摸式手機

package cn.ppdxzz.bridge;
/**
 * Description:觸摸式手機
 * @Author: PeiChen JavaAnything
 */
public class TouchPhone extends Phone {

    public TouchPhone(Brand brand) {
        super(brand);
    }

    @Override
    public void open() {
        super.open();
        System.out.println("觸摸式手機");
    }

    @Override
    public void call() {
        super.call();
        System.out.println("觸摸式手機");
    }

    @Override
    public void close() {
        super.close();
        System.out.println("觸摸式手機");
    }
}

摺疊式手機

package cn.ppdxzz.bridge;
/**
 * Description:摺疊式手機
 * @Author: PeiChen JavaAnything
 */
public class FoldedPhone extends Phone {

    public FoldedPhone(Brand brand) {
        super(brand);
    }

    @Override
    public void open() {
        super.open();
        System.out.println("摺疊式手機");
    }

    @Override
    public void call() {
        super.call();
        System.out.println("摺疊式手機");
    }

    @Override
    public void close() {
        super.close();
        System.out.println("摺疊式手機");
    }
}

成品手機

package cn.ppdxzz.bridge;

/**
 * Description:橋接模式(手機不同樣式不同品牌的案例)
 * @Author: PeiChen JavaAnything
 */
public class Client {

    public static void main(String[] args) {
        System.out.println("(=====oppo品牌的手機=====)");
        Phone phone1 = new TouchPhone(new Oppo());
        phone1.open();
        phone1.call();
        phone1.close();
        System.out.println("(=====vivo品牌的手機=====)");
        Phone phone2 = new FoldedPhone(new Vivo());
        phone2.open();
        phone2.call();
        phone2.close();
    }

}

演示:

image-20200408150315089

橋接模式在 JDBC 中的源碼分析

)

分析:

JDBC 中的 Driver 接口,如果從橋接模式來看,Driver 就是一個接口,下面可以有 MySQL 的 Driver,Oracle 的 Driver,這些就可以當做實現接口類。Driver 和 Connection 之間通過 DriverManager 橋接。

總結:
  • 橋接模式使抽象和實現的進行分離,極大的提高了系統的靈活性,這有助於系統進行分層設計,從而產生更好的結構化系統。
  • 橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
  • 橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與編程。

橋接模式的講解就先到這裏,另外橋接模式要求正確識別出系統中兩個獨立變化的維度(抽象和實現),因此其使用範圍具有一定的侷限性。

使抽象和實現的進行分離,極大的提高了系統的靈活性,這有助於系統進行分層設計,從而產生更好的結構化系統。

  • 橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
  • 橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與編程。

橋接模式的講解就先到這裏,另外橋接模式要求正確識別出系統中兩個獨立變化的維度(抽象和實現),因此其使用範圍具有一定的侷限性。

微信公衆號,JavaAnything,期待你的關注!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章