設計模式--第6篇(橋接模式)

一,橋接模式

橋接模式:

  1. 一種結構型設計模式,將實現和抽象放在兩個不同的類層次中,使得兩個層次可以獨立改變;
  2. 基於類的最小設計原則,通過使用封裝、聚合及繼承等行爲讓不同的類承擔不同的職責,主要是 把抽象和實現分隔開來,保證各自的獨立型和功能擴展;

二,原理類圖

在這裏插入圖片描述
意圖: 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
適用性:

  1. 你不希望在抽象和它的實現部分之間有一個固定的綁定關係。例如這種情況可能是因爲,在程序運行時刻實現部分應可以被選擇或者切換。
  2. 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時Bridge 模式使你可以對不同的抽象接口和實現部分進行組合,並分別對它們進行擴充。
  3. 對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的代碼不必重新編譯。
  4. 有許多類要生成。這樣一種類層次結構說明你必須將一個對象分解成兩個部分。
  5. 你想在多個對象間共享實現(可能使用引用計數),但同時要求客戶並不知道這一點。

三,實例

左橋

package com.neei.bridge;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/7  12:59
 * @Description: 遊學網
 * @throws:
 */
public interface Brand {
    void open();

    void call();

    void close();
}

左橋墩

package com.neei.bridge;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/7  13:01
 * @Description: 遊學網
 * @throws:
 */
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 com.neei.bridge;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/7  13:00
 * @Description: 遊學網
 * @throws:
 */
public class XiaoMi implements Brand {
    @Override
    public void open() {
        System.out.println("小米開機");
    }

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

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

右橋

package com.neei.bridge;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/7  13:04
 * @Description: 遊學網
 * @throws:
 */
public abstract class Phone {
    private Brand brand;

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

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

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

右橋墩

package com.neei.bridge;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/7  13:07
 * @Description: 遊學網
 * @throws:
 */
public class FolderPhone extends Phone {
    public FolderPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        System.out.println("翻蓋");
        super.open();
    }

    @Override
    protected void call() {
        System.out.println("翻蓋");
        super.call();
    }

    @Override
    protected void close() {
        System.out.println("翻蓋");
        super.close();
    }
}

package com.neei.bridge;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/7  13:12
 * @Description: 遊學網
 * @throws:
 */
public class UpRightPhone extends Phone {
    public UpRightPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        System.out.println("滑蓋");
        super.open();
    }

    @Override
    protected void call() {
        System.out.println("滑蓋");
        super.call();
    }

    @Override
    protected void close() {
        System.out.println("滑蓋");
        super.close();
    }
}

調用

package com.neei.bridge;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/7  13:13
 * @Description: 遊學網
 * @throws:
 */
public class Client {
    public static void main(String[] args) {
        Phone phone1 = new FolderPhone(new Vivo());
        phone1.open();
        phone1.call();
        phone1.close();
        System.out.println("------------------------------");
        Phone phone2 = new FolderPhone(new XiaoMi());
        phone2.open();
        phone2.call();
        phone2.close();
        System.out.println("------------------------------");
        Phone phone3 = new UpRightPhone(new XiaoMi());
        phone3.open();
        phone3.call();
        phone3.close();
    }
}

四,源碼分析

Mybatis源碼中使用的橋接模式,如DriverManager

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