設計模式(八)——橋接模式

十四lin發表於2021-02-04

1 手機操作問題

現在對不同手機型別的不同品牌實現操作程式設計(比如:開機、關機、上網,打電話等),如圖:

 

 

 

2 傳統方案解決手機操作問題

傳統方法對應的類圖

 

 

 

3 傳統方案解決手機操作問題分析

1) 擴充套件性問題(類爆炸),如果我們再增加手機的樣式(旋轉式),就需要增加各個品牌手機的類,同樣如果我們增加一個手機品牌,也要在各個手機樣式類下增加。

2) 違反了單一職責原則,當我們增加手機樣式時,要同時增加所有品牌的手機,這樣增加了程式碼維護成本.

3) 解決方案-使用橋接模式

4 橋接模式(Bridge)-基本介紹

基本介紹

1) 橋接模式(Bridge 模式)是指:將實現與抽象放在兩個不同的類層次中,使兩個層次可以獨立改變。

2) 是一種結構型設計模式

3) Bridge 模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行為讓不同的類承擔不同的職責。它的主要特點是把抽象(Abstraction)與行為實現(Implementation)分離開來,從而可以保持各部分的獨立性以及應對他們的功能擴充套件

5 橋接模式(Bridge)-原理類圖

1) Client 類:橋接模式的呼叫者

2) 抽象類(Abstraction) :維護了 Implementor / 即它的實現類 ConcreteImplementorA.., 二者是聚合關係, Abstraction充當橋接類

3) RefinedAbstraction :   Abstraction  抽象類的子類

4) Implementor :  行為實現類的介面

5) ConcreteImplementorA /B :行為的具體實現類

6)從 UML 圖:這裡的抽象類和介面是聚合的關係,其實呼叫和被呼叫關係

6 橋接模式解決手機操作問題

使用橋接模式改進傳統方式,讓程式具有搞好的擴充套件性,利用程式維護

1) 應用例項說明(和前面要求一樣)

2)  使用橋接模式對應的類圖

 

Brand類

 


package com.lin.bridge;

public interface Brand {

    void open();
    void close();
    void call();
    
}

class XiaoMi implements Brand{

    @Override
    public void open() {
        System.out.println("小米手機開機!");
    }

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

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

class Vivo implements Brand{

    @Override
    public void open() {
        System.out.println("Vivo手機開機!");
    }

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

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

FoldedPhone類

package com.lin.bridge;

public class FoldedPhone extends Phone{

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

    public void open() {
        super.open();
        System.out.println("摺疊手機");
    }
    
    public void close() {
        super.close();
        System.out.println("摺疊手機");
    }
    
    public void call() {
        super.call();
        System.out.println("摺疊手機");
    }
    
}

Phone類

package com.lin.bridge;

public abstract class Phone {

    private Brand brand;

    public Phone(Brand brand) {
        super();
        this.brand = brand;
    }
    
    protected void open() {
        this.brand.open();
    }
    
    protected void close() {
        this.brand.close();
    }
    
    protected void call() {
        this.brand.call();
    }
}

Client類

package com.lin.bridge;

public class Client {

    public static void main(String[] args) {
        Phone foldedPhone = new FoldedPhone(new Vivo());
        foldedPhone.close();
    }
}

橋接模式在 JDBC 的原始碼剖析

橋接模式在 JDBC 的原始碼剖析

1) Jdbc  Driver 介面,如果從橋接模式來看,Driver 就是一個介面,下面可以有 MySQL  Driver,Oracle 的

Driver,這些就可以當做實現介面類

2) 程式碼分析

 

 

8 橋接模式的注意事項和細節

1) 實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統。

2) 對於系統的高層部分,只需要知道抽象部分和實現部分的介面就可以了,其它的部分由具體業務來完成。

3) 橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。

4) 橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計和程式設計

5) 橋接模式要求正確識別出系統中兩個獨立變化的維度(抽象、和實現),因此其使用範圍有一定的侷限性,即需要有這樣的應用場景。

橋接模式其它應用場景

對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用.

9 常見的應用場景:

1) -JDBC 驅動程式

2) -銀行轉賬系統

轉賬分類: 網上轉賬,櫃檯轉賬,AMT 轉賬

轉賬使用者型別:普通使用者,銀卡使用者,金卡使用者..

3) -訊息管理

訊息型別:即時訊息,延時訊息

訊息分類:手機簡訊,郵件訊息,QQ 訊息...

 

僅供參考,有錯誤還請指出!

有什麼想法,評論區留言,互相指教指教。

 

相關文章