1. 程式人生 > >JAVA設計模式之 橋接模式【Bridge Pattern】

JAVA設計模式之 橋接模式【Bridge Pattern】

一、概述
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。它是一種物件結構型模式,又稱為柄體(Handle and Body)模式。

二、適用場景
處理多維度變化。
業務場景:某功能為將資料庫中的資料轉換成多種檔案格式,例如txt、xml、pdf等格式,同時需要支援多種不同型別的資料庫的讀取。便可使用橋接模式對其進行設計。
這裡的維度有兩個 分別為:不同的檔案格式 和 不同的資料庫型別。如下圖:
這裡寫圖片描述

三、UML類圖
橋接模式通用結構圖:
這裡寫圖片描述
針對上面的業務場景-橋接模式-示例結構圖:
這裡寫圖片描述

四、參與者
①Abstraction(抽象類):用於定義抽象類的介面,它一般是抽象類而不是介面,其中定義了一個Implementor(實現類介面)型別的物件並可以維護該物件,它與Implementor之間具有關聯關係,它既可以包含抽象業務方法,也可以包含具體業務方法。
②RefinedAbstraction(擴充抽象類):擴充由Abstraction定義的介面,通常情況下它不再是抽象類而是具體類,它實現了在Abstraction中宣告的抽象業務方法,在RefinedAbstraction中可以呼叫在Implementor中定義的業務方法。
③Implementor(實現類介面):定義實現類的介面,這個介面不一定要與Abstraction的介面完全一致,事實上這兩個介面可以完全不同,一般而言,Implementor介面僅提供基本操作,而Abstraction定義的介面可能會做更多更復雜的操作。Implementor介面對這些基本操作進行了宣告,而具體實現交給其子類。通過關聯關係,在Abstraction中不僅擁有自己的方法,還可以呼叫到Implementor中定義的方法,使用關聯關係來替代繼承關係。
④ConcreteImplementor(具體實現類):具體實現Implementor介面,在不同的ConcreteImplementor中提供基本操作的不同實現,在程式執行時,ConcreteImplementor物件將替換其父類物件,提供給抽象類具體的業務操作方法。

五、用例學習<以適用場景裡的業務場景作為程式碼設計>
1、JDBC 驅動連線管理類:JdbcDriverManager.java

/**
 * JDBC 驅動連線管理類
 * @author [email protected]
 *
 */
public class JdbcDriverManager {

    public String connectAndReadOracle(){
        // 模擬連線Oracle資料庫的程式碼
        System.out.println("已成功連線到Oracle資料庫");
        // 模式 省略 從資料庫中獲取內容的程式碼
String content = "已成功從Oracle資料庫中讀取到了內容"; return content; } public String connectAndReadMySql(){ // 模擬連線MySql資料庫的程式碼 System.out.println("已成功連線到MySql資料庫"); // 模式 省略 從資料庫中獲取內容的程式碼 String content = "已成功從MySql資料庫中讀取到了內容"; return content; } public
String connectAndReadSqlServer(){ // 模擬連線Sql Server資料庫的程式碼 System.out.println("已成功連線到Sql Server資料庫"); // 模式 省略 從資料庫中獲取內容的程式碼 String content = "已成功從Sql Server資料庫中讀取到了內容"; return content; } }

2、<角色:實現類介面> FileExportImpl.java

/**
 * 獲取檔案內容、連線資料庫來源介面
 * @author [email protected]
 *
 */
public interface FileExportImpl {
    /**
     * 讀取資料庫中的內容
     * @param jdbcDriver
     * @return
     */
    public String readContent();
}

3、<角色:具體實現類> FileExportFromOracle.java

/**
 * 從Oracle資料庫獲取內容
 * @author [email protected]
 *
 */
public class FileExportFromOracle implements FileExportImpl {

    @Override
    public String readContent() {
        JdbcDriverManager jdbcDriver = new JdbcDriverManager();
        return jdbcDriver.connectAndReadOracle();
    }

}

4、<角色:具體實現類> FileExportFromMySql.java

/**
 * 從MySql資料庫獲取內容
 * @author [email protected]
 *
 */
public class FileExportFromMySql implements FileExportImpl {

    @Override
    public String readContent() {
        JdbcDriverManager jdbcDriver = new JdbcDriverManager();
        return jdbcDriver.connectAndReadMySql();
    }

}

5、<角色:具體實現類> FileExportFromSqlServer.java

/**
 * 從Sql Server資料庫獲取內容
 * @author [email protected]
 *
 */
public class FileExportFromSqlServer implements FileExportImpl {

    @Override
    public String readContent() {
        JdbcDriverManager jdbcDriver = new JdbcDriverManager();
        return jdbcDriver.connectAndReadSqlServer();
    }

}

6、<角色:抽象類> FileExportAbstraction.java

/**
 * 檔案格式匯出 抽象類
 * @author [email protected]
 *
 */
public abstract class FileExportAbstraction {

    protected FileExportImpl fileSouce;

    public void setFileSource(FileExportImpl fileSouce){
        this.fileSouce = fileSouce;
    }

    public abstract void exportFile();

}

7、<角色:擴充抽象類> TxtFileExport.java

/**
 * Txt檔案格式匯出具體類
 * @author [email protected]
 *
 */
public class TxtFileExport extends FileExportAbstraction {

    @Override
    public void exportFile() {
        String readContent = fileSouce.readContent();
        System.out.println(readContent + ",將內容匯出為.txt格式");
    }

}

8、<角色:擴充抽象類> XmlFileExport.java

/**
 * xml檔案格式匯出具體類
 * @author  [email protected]
 *
 */
public class XmlFileExport extends FileExportAbstraction {

    @Override
    public void exportFile() {
        String readContent = fileSouce.readContent();
        System.out.println(readContent + ",將內容匯出為.xml格式");
    }
}

9、<角色:擴充抽象類> PdfFileExport.java

/**
 * pdf檔案格式匯出具體類
 * @author  [email protected]
 *
 */
public class PdfFileExport extends FileExportAbstraction {

    @Override
    public void exportFile() {
        String readContent = fileSouce.readContent();
        System.out.println(readContent + ",將內容匯出為.pdf格式");
    }
}

10、客戶端測試類: Client.java

public class Client {

    public static void main(String[] args) {
        FileExportImpl fileOracle = new FileExportFromOracle();
        FileExportImpl fileMySql = new FileExportFromMySql();
        FileExportImpl fileSqlServer = new FileExportFromSqlServer();

        FileExportAbstraction fileTxtExport = new TxtFileExport();
        FileExportAbstraction fileXmlExport = new XmlFileExport();
        FileExportAbstraction filePdfExport = new PdfFileExport();

        // 如果我們要從Oracle中匯出xml格式的資料
        fileXmlExport.setFileSource(fileOracle);
        fileXmlExport.exportFile();

        System.out.println("--------------------\n");
        // 如果我們要從Oracle中匯出txt格式的資料
        fileTxtExport.setFileSource(fileOracle);
        fileTxtExport.exportFile();

        System.out.println("--------------------\n");
        // 如果我們要從MySql中匯出pdf格式的資料
        filePdfExport.setFileSource(fileMySql);
        filePdfExport.exportFile();
    }

}

11、執行結果 如下:

已成功連線到Oracle資料庫
已成功從Oracle資料庫中讀取到了內容,將內容匯出為.xml格式
--------------------

已成功連線到Oracle資料庫
已成功從Oracle資料庫中讀取到了內容,將內容匯出為.txt格式
--------------------

已成功連線到MySql資料庫
已成功從MySql資料庫中讀取到了內容,將內容匯出為.pdf格式

12、後續系統擴充套件
①、現如果需求要求新增加一種檔案輸入格式 如:html格式
則只需新寫一個FileExportAbstraction抽象類的子類 用以輸出html格式即可,而不需要修改其他任何類、不需要修改另一維度的程式碼。
②、現如果需求要求新增加一型別資料庫型別 如:Sybase
則只需新寫一個FileExportImpl介面的實現類、用以從Sybase資料庫中獲取內容、並修改JdbcDriverManager.java類、新增對Sybase資料庫的連線和訪問。

由此可見 在兩個變化維度中任意擴充套件一個維度,都不需要修改原有系統、提高了系統的擴充套件性和可維護性。

六、其他
主要優點:
(1)分離抽象介面及其實現部分。橋接模式使用“物件間的關聯關係”解耦了抽象和實現之間固有的繫結關係,使得抽象和實現可以沿著各自的維度來變化。所謂抽象和實現沿著各自維度的變化,也就是說抽象和實現不再在同一個繼承層次結構中,而是“子類化”它們,使它們各自都具有自己的子類,以便任何組合子類,從而獲得多維度組合物件。
(2)在很多情況下,橋接模式可以取代多層繼承方案,多層繼承方案違背了“單一職責原則”,複用性較差,且類的個數非常多,橋接模式是比多層繼承方案更好的解決方法,它極大減少了子類的個數。
(3)橋接模式提高了系統的可擴充套件性,在兩個變化維度中任意擴充套件一個維度,都不需要修改原有系統,符合“開閉原則”。

相關推薦

JAVA設計模式 模式Bridge Pattern

一、概述 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。它是一種物件結構型模式,又稱為柄體(Handle and Body)模式。 二、適用場景 處理多維度變化。 業務場景:某功能為將資料庫中的資料轉換成多種檔案格式,例如

Java二十三設計模式-----模式

second his manager man @override end html con 太多的 一、橋接模式(Bridge) 橋接模式就是把事物和其具體實現分開,使他們可以各自獨立的變化。橋接的用意是:將抽象化與實現化解耦,使得二者可以獨立變化,像我們常用的JDBC橋

JAVA開發的23種設計模式 --- 模式

橋接模式    概述:將抽象部分與他的實現部分分離,這樣抽象化與實現化解耦,使他們可以獨立的變化.如何實現解耦的呢,就是通過提供抽象化和實現化之間的橋接結構.    應用場景      &n

設計模式模式——Java語言描述

vat 有一個 .com pre color demo 靜態 red 實現 橋接適用於把抽象化和實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構性模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦 這種模式設計到一個作為橋接的接口,使得實體類的功

Java設計模式模式

合成/聚合複用原則:儘量使用合成/聚合,儘量不要使用類繼承。聚合表示一種弱的 ‘擁有’ 關係,體現A物件可以包含B物件,但B物件不是A物件的一部分;合成則是一種強的‘擁有’ 關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣,比方說雁有兩個翅膀,翅膀與大雁是部分與

設計模式模式優秀的程序結構(十五)

維度 邏輯 抽象 工作 多個 lan 能夠 十分 實現 咱不要多, 就一個隱身技能, 嘿嘿嘿 定義 橋接模式(bridge): 在軟件系統中, 某些由於自身的邏輯, 它具有兩個或多個維度的變化, 那麽如何應對這種"多維度的變化"? 如何利用面向對象的技術來使得該類型能夠輕

設計模式模式 Bridge

sed lap println 模式 generated this blog opened es2017 代碼實現 public interface Brand { void sale(); } class Lenovo implemen

設計模式模式

span ridge -s ring 獨立 橋接 ont rgs rri 橋接模式:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 public abstract class PhoneApp { public abstract void funcio

設計模式模式(Bridge)

out ima img 例子 視圖 存在 關系 第一條 用法 橋接模式屬於先天模式,這裏的先天模式就是說一開始就要把結構搭建好,方便後來的擴展,而不是對已經出現的模塊和接口進行改進擴展的。橋接的核心在於實體類和操作類之間的聚合關系,這個聚合關系就是我們所說的"橋",不同於

設計模式的藝術 結構性模式模式

不懂使用為學過,說出用途,繪製結構為了解,不會靈活使用基本等於沒學。 前言 瞭解過畫畫的人都知道,顏色有很多種,紙也有很多種,但是他們直接怎麼連線起來呢??通過筆,來使其靈活生動的轉換起來,橋接模式也是這個原理,是一種物件結構型模式 什麼是橋接模式  Bridge Patter

設計模式 —— 模式

概述:將抽象部分與他的實現部分分離,這樣抽象化與實現化解耦,使他們可以獨立的變化.如何實現解耦的呢,就是通過提供抽象化和實現化之間的橋接結構.應用場景:實現系統可能有多個角度分類,每一種角度都可能變化. 解釋:橋接模式將繼承模式轉化成關聯關係,他降低了類與類之間的耦合度,減少了系統中類的數量,也

設計模式模式Bridge Pattern

設計模式之橋接模式(Bridge Pattern) 備註:只是瞭解了大概,在實際應用中還沒有 1.用處 將抽象部分與實現部分分離,使它們都可以獨立的變化。 2. 分類 結構型模式 3. UML 4. 程式碼 測試類Test public class Test { publ

php設計模式模式

一、橋接模式 橋連模式:將抽象部分與實現部分分離,使它們都可以獨立的變化。它是一種結構性模式,又稱柄體(Handle and body)模式或者介面(Interface)模式。        當一個抽象可能有多個實現時,通常用繼承來協調他們。抽象類的定義對該抽象的介面

通過例子學設計模式--模式以及使用場景說明(C++實現)

             橋是一種結構。橋接模式的類圖和橋很像,是一種結構型的設計模式。             通常情況下,橋兩邊各有一個橋墩,每個橋墩我們可以理解為一個抽象類,或者是一個變化。中間的橋樑我們可以理解為類的“關聯”,這個關聯就是聚合。這樣就組成了橋接模式。

javascript中設計模式模式詳解(Bridge design)

一、橋接模式 1、橋接模式是一種既能把倆個物件連線在一起,又能避免二者間的強耦合的方法。通過“橋”把彼此聯絡起來,同時又允許他們各自獨立變化 2、橋接模式主要作用就是將抽象與其實現隔離開來,以便二者獨

C++設計模式模式

//橋接模式,合成,聚合複用原則 #include<iostream> using namespace std; class Soft { public: virtual void run() = 0; }; class Notepad

設計模式模式(結構型)

n) oid 實現接口 div 創建 結構型模式 face interface pre 目錄 模式定義 模式角色 模式分析 模式例子 模式應用

設計模式--模式

技術 數量 導致 idg 優缺點 ttr 新建 job () 橋接模式--導讀   我們應該都看過西遊記吧,畢竟這是大家童年的經典。想必你一定見過這麽一幕天蓬元帥犯了錯誤,而被罰投胎為豬身,此時,雖然天蓬元帥的靈魂沒有變,但是身體卻變成的豬身體。假如這個豬的身體是玉帝親手

結構型模式 模式

ons 希望 span public 註意事項 角色 轉換 缺點 turn 橋接模式(Bridge Pattern):將抽象部分與它的實現部分分離,使它們都可以獨立地變化。它是一種對象結構型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模

Java進階篇設計模式四 -----適配器模式模式

原則 pub 是我 protect 接口 logs 將不 多說 外鏈 前言 在上一篇中我們學習了創建型模式的建造者模式和原型模式。本篇則來學習下結構型模式的適配器模式和橋接模式。 適配器模式 簡介 適配器模式是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬於結構型模