橋接設計模式

手機操做問題

如今對不一樣手機類型的不一樣品牌實現操做編程(好比:開機、關機、上網,打電話等),如圖:java

傳統解決方案

從功能上來講,這樣設計是能夠的。可是,如果增長一種新的樣式,那麼一樣的它也會新增不一樣品牌手機的子類,這樣就會致使類爆炸的問題。編程

傳統方案解決手機操做問題分析:
一、擴展性問題(類爆炸),若是咱們再增長手機的樣式(旋轉式),就須要增長各個品牌手機的類,一樣若是咱們增長一個手機品牌,也要在各個手機樣式類下增長。
二、違反了單一職責原則,當咱們增長手機樣式時,要同時增長全部品牌的手機,這樣增長了代碼維護成本。
能夠經過橋接模式解決這個問題。設計模式

橋接模式

基本介紹

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

橋接模式原理類圖

原理類圖說明:
一、Client類:橋接模式的調用者;
二、抽象類(Abstraction) :維護了Implementor /即它的實現類ConcreteImplementorA..,兩者是聚合關係, Abstraction充當橋接類;this

三、RedefinedAbstraction:是Abstraction抽象類的子類;設計

四、Implementor:行爲實現類的接口;3d

五、ConcreteImplementorA/B:行爲的具體實現類。code

從UML類圖中能夠看出,這裏的抽象類和接口是聚合的關係,也就是調用和被調用的關係。blog

橋接模式解決手機問題

一、手機品牌繼承

// 接口
public interface Brand {
    void open();
    void close();
    void call();
}

具體的手機品牌:小米

public 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(" 小米手機打電話 ");
    }
}

具體的手機品牌:華爲

public class HuaWei implements Brand {

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

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

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

二、手機樣式

手機抽象類:

public abstract class Phone {
    //組合品牌
    private Brand brand;

    //構造器
    public Phone(Brand brand) {
        super();
        this.brand = brand;
    }

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

直立式:

public class UpRightPhone extends Phone {

    //構造器
    public UpRightPhone(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
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(" 摺疊樣式手機 ");
    }
}

三、客戶端

public class Client {

    public static void main(String[] args) {

        //獲取摺疊式手機 (樣式 + 品牌 )

        Phone phoneXiaomi = new FoldedPhone(new XiaoMi());

        phoneXiaomi.open();
        phoneXiaomi.call();
        phoneXiaomi.close();

        System.out.println("=======================");
        Phone phoneHuaWei= new FoldedPhone(new HuaWei());

        phoneHuaWei.open();
        phoneHuaWei.call();
        phoneHuaWei.close();
        System.out.println("=======================");

        UpRightPhone phone3 = new UpRightPhone(new XiaoMi());

        phone3.open();
        phone3.call();
        phone3.close();
    }
}

手機樣式、品牌擴展

由上面的類圖咱們能夠看出來,當咱們增長蘋果手機品牌和旋轉樣式的時候,只須要增長兩個類。

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

一、實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統; 二、對於系統的高層部分,只須要知道抽象部分和實現部分的接口就能夠了,其它的部分由具體業務來完成; 三、橋接模式替代多層繼承方案,能夠減小子類的個數,下降系統的管理和維護成本。 四、橋接模式的引入增長了系統的理解和設計難度,因爲聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計和編程; 五、橋接模式要求正確識別出系統中兩個獨立變化的維度,所以其使用範圍有必定的侷限性,即須要有這樣的應用場景。

相關文章
相關標籤/搜索