Java設計模式 —— 橋接模式(Bridge)

Java設計模式 —— 橋接模式(Bridge)

定義

橋接模式:將抽象部分與它的實現部分相分離,使他們能夠獨立的變化。html

特徵:java

  1. 三個關鍵詞,也就是抽象化、實現化和脫耦
  2. 橋接模式將抽象部分和實現部分分離,解耦
  3. 兩個維度,獨立變化,靈活的擴展

代碼實現

簡書:Android 設計模式之橋接模式web

  • 這裏咱們經過泡咖啡的例子來簡單看看橋接模式的實現和應用
public abstract class Coffee {
    protected CoffeeAdditives impl;

    public Coffee (CoffeeAdditives impl) {
        this.impl = impl;
    }

    /** * 咖啡具體是什麼樣的由子類決定 */
    public abstract void makeCoffee();
}
  • 咖啡的子類,大杯和小杯,加不加糖的操做經過impl添加進來
//大杯咖啡
public class LargeCoffee extends Coffee {

    public LargeCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    public void makeCoffee() {
        System.out.println("大杯的" + impl.addSomething() + "咖啡");
    }
}
//小杯咖啡
public class SmallCoffee extends Coffee {

    public SmallCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    public void makeCoffee() {
        System.out.println("小杯的" + impl.addSomething() + "咖啡");
    }
}
  • 下面咱們看看實現部分,也就是加不加糖
public abstract class CoffeeAdditives {

    /** * 具體添加什麼東西由子類決定 * * @return 添加的東西,好比加糖 */
    public abstract String addSomething();
}
  • 加糖和不加糖的子類
//加糖
public class Sugar extends CoffeeAdditives {

    @Override
    public String addSomething() {
        return "加糖";
    }
}
//不加糖,這裏就是原味了
public class Ordinary extends CoffeeAdditives {

    @Override
    public String addSomething() {
        return "原味";
    }
}
  • 以上抽象部分和實現部分都完成了,如今咱們來看看怎麼「泡咖啡」
//原味
Ordinary ordinary = new Ordinary();

//加糖
Sugar sugar = new Sugar();

//大杯咖啡,原味
LargeCoffee largeCoffee = new LargeCoffee(ordinary);
largeCoffee.makeCoffee();

//小杯咖啡,原味
SmallCoffee smallCoffee = new SmallCoffee(ordinary);
smallCoffee.makeCoffee();

//大杯咖啡,加糖
LargeCoffee largeCoffeeSugar = new LargeCoffee(sugar);
largeCoffeeSugar.makeCoffee();

//小杯咖啡,加糖
SmallCoffee smallCoffeeSugar = new SmallCoffee(sugar);
smallCoffeeSugar.makeCoffee();
  • 輸出日誌

大杯的原味咖啡
小杯的原味咖啡
大杯的加糖咖啡
小杯的加糖咖啡編程

經過以上的例子咱們能夠看出橋接模式可以分離抽象與實現,並且擴展也很靈活。好比咱們須要添加個中杯的咖啡,只須要在抽象部分,也就是寫個Coffee的子類MiddleCoffee就好了,而實現部分,CoffeeAdditives則不受影響。若是咖啡須要加鹽或是其餘什麼的一樣也很簡單。segmentfault

外觀模式使用問題

優勢:
一、抽象和實現的分離。
二、優秀的擴展能力。
三、實現細節對客戶透明。設計模式

缺點:橋接模式的引入會增長系統的理解與設計難度,因爲聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計與編程。ide

Android中外觀模式

AbsListView跟ListAdapter之間就是一個橋接模式。
在這裏插入圖片描述
另外,Window 與 WindowManager 之間也是橋接模式。svg

感謝

segmentfault: 橋接模式
菜鳥教程:橋接模式
百度百科:橋接模式
博客園:《JAVA與模式》之橋樑模式
簡書:Android 設計模式之橋接模式this