Java設計模式之橋接模式

橋接模式

傳統方法解決手機操作問題:

在這裏插入圖片描述

傳統方法解決手機操作問題::
  1. 擴展性問題(類爆炸),如果我們再增加手機的樣式(旋轉式),就需要增加各個的品牌手機的類,同樣如果我們增加一個手機品牌,也要在各個手機樣式類下增加。

我們只是想增加一個手機品牌,這樣的類結構必須讓我們在每個樣式下去增加品牌,非常繁瑣

  1. 違反了單一職責原則,當我們增加手機樣式時,要同時增加所有品牌的手機,這
    樣增加了代碼維護成本.
  2. 解決方案-使用橋接模式

在這裏插入圖片描述
傳統模式需要7個具有繼承關係的類去實現此結構,假如我們再去加入一個iphone品牌手機,那麼我們需要再多加三個類
在這裏插入圖片描述
橋接模式需要6個類去實現此結構,假如我們再假如iphone品牌手機,那麼我們只需要增加一個類

基本介紹:
  1. 橋接模式(Bridge模式)是指:將實現與抽象放在兩個不同的類層次中,使兩個層
    次可以獨立改變。
  2. 是一種結構型設計模式
  3. Bridge模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行爲讓不同
    的類承擔不同的職責。它的主要特點是把抽象(Abstraction)與行爲實現
    (Implementation)分離
    開來,從而可以保持各部分的獨立性以及應對他們的功能
    擴展

在這裏插入圖片描述

  1. Client類:橋接模式的調用者
  2. 抽象類(Abstraction) :維護了 Implementor / 即它的實現類ConcreteImplementorA…, 二者是聚合關係, Abstraction 充當橋接類
    3)RefinedAbstraction :是Abstraction抽象類的子類
    4)Implementor:行爲實現類的接口
    5)ConcreteImplementorA/B:行爲的具體實現類
    6)從uml圖這裏的抽象類和接口是聚合的關係
代碼實現:

在這裏插入圖片描述

代碼介紹:
  • 橋接類(抽象類):Phone
  • 抽象類的子類:FoldedPhone UpRightPhone
    手機樣式
    ===========================================
    手機品牌
  • 行爲實現類的接口: Brand
  • 行爲的具體實現類:Vivo Xiaomi

對於有多個變化的維度,我們一般採用上述類結構來實現,這樣除了減少系統中的類個數,也利於系統擴展。對於方案二的應用我們稱之爲橋接模式。

行爲實現類的接口: Brand

/**
 * @author 孫一鳴 on 2020/2/9
 */
public  interface Brand {
    void open();
    void close();
    void call();
}

行爲的具體實現類:Vivo Xiaomi

/**
 * @author 孫一鳴 on 2020/2/9
 */
public 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手機通話功能");
    }
}


/**
 * @author 孫一鳴 on 2020/2/9
 */
public class Xiaomi implements Brand {
    @Override
    public void open() {
        System.out.println("xiaomi手機開機");
    }

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

    @Override
    public void call() {
        System.out.println("小米手機通話功能");
    }
}

橋接類(抽象類):Phone

/**
 * @author 孫一鳴 on 2020/2/9
 */
public abstract class Phone {
    private Brand brand;//brand是接口,vivo xiaomi 實現此接口

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

抽象類的子類:FoldedPhone UpRightPhone


/**
 * @author 孫一鳴 on 2020/2/9
 */
public class FoldedPhone extends Phone {
    public FoldedPhone(Brand brand) {
        super(brand);
    }

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

    }

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

    }

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

package 設計模式.橋接模式.硅谷;

/**
 * @author 孫一鳴 on 2020/2/9
 */
public class UpRightPhone  extends Phone{
    public UpRightPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        super.open();
        System.out.println("直立樣式手機");
    }

    @Override
    protected void close() {
        super.close();
        System.out.println("直立樣式手機");
    }

    @Override
    protected void call() {
        super.call();
        System.out.println("直立樣式手機");
    }
}

在這裏插入圖片描述
在這裏插入圖片描述

橋接模式的優點:
  • 實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實
    現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統。
  • 對於系統的高層部分,只需要知道抽象部分和實現部分的接口就可以了,其它的部
    分由具體業務來完成。
  • 橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
橋接模式的缺點:
  • 橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,
    要求開發者針對抽象進行設計和編程
  • 橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用範圍有一定的局
    限性,即需要有這樣的應用場景。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章