天天看點

Java23種設計模式(GOF)——橋接模式

橋接模式(bridge)

    • 場景
    • 核心要點
      • 案例
    • 應用場景
    • 總結

場景

  • 商城系統中常見的商品分類,以電腦為類,如何良好的處理商品分類銷售的問題?如圖:
    Java23種設計模式(GOF)——橋接模式
    Java23種設計模式(GOF)——橋接模式
    可以使用多層繼承結構實作上圖的關系,但存在以下問題:
  • 擴充性問題(類個數膨脹問題):
    • 如果要增加一個新的電腦類型:智能手機,則要增加各個品牌下面的類
    • 如果要增加一個新的品牌,也要增加各種電腦類型的類
  • 違反單一職責原則:
    • 一個類:聯想筆記本,有兩個引起這個類變化的原因

在這個場景下有兩個變化的次元:電腦類型、電腦品牌

此時,可以将這個兩個次元分開,根據次元分别構成類繼承結構,并關聯這個兩個次元的類

核心要點

  • 處理多層繼承結構,處理多元度變換的場景,将各個次元設計成獨立的繼承結構,使各個次元可以獨立的擴充在抽象層建立關聯。

案例

/**
 * 品牌
 * @author huangyzh
 * @create 2020-05-17 16:06
 */
public interface Brand {
    void sale();
}
           
/**
 * 電腦類型的次元
 * @author huangyzh
 * @create 2020-05-17 16:08
 */
public abstract class Computer2 {
    protected Brand brand;

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

    public void sale(){
        brand.sale();
    }
}
           
/**
 * @author huangyzh
 * @create 2020-05-17 16:10
 */
public class Desktop2 extends Computer2 {
    public Desktop2(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        super.sale();
        System.out.println("銷售桌上型電腦");
    }
}
           
/**
 * @author huangyzh
 * @create 2020-05-17 16:11
 */
public class Laptop2 extends Computer2 {
    public Laptop2(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        super.sale();
        System.out.println("銷售筆記本");
    }
}
           
/**
 * @author huangyzh
 * @create 2020-05-17 16:07
 */
public class Lenovo implements Brand {
    @Override
    public void sale() {
        System.out.println("銷售lenovo電腦");
    }
}
           
/**
 * @author huangyzh
 * @create 2020-05-17 16:08
 */
public class Dell implements Brand {
    @Override
    public void sale() {
        System.out.println("銷售Dell電腦");
    }
}

           
/**
 * @author huangyzh
 * @create 2020-05-17 16:12
 */
public class Test01 {
    public static void main(String[] args) {
        //銷售lenovo筆記本電腦
        Computer2 c = new Laptop2(new Lenovo());
        c.sale();
    }
}
           

橋接模式案例圖:

Java23種設計模式(GOF)——橋接模式

應用場景

  • JDBC驅動程式
  • AWT中的Peer架構
  • 銀行日志管理:
    • 格式分類:記錄檔、交易日志、異常日志
    • 距離分類:本地記錄日志、異地記錄日志
  • 人類資源系統中的獎金計算子產品:
    • 獎金分類:個人獎金、團隊獎金、激勵獎金
    • 部門分類:人事部門、銷售部門、研發部門
  • OA系統中的消息處理:
    • 業務類型:普通消息、加急消息、特急消息
    • 發生消息方式:系統内消息、短信、郵件

總結

  • 橋接模式可以取代多層繼承的方案。多層繼承違背了單一職責原則,複用性較差,類的個數也非常多。橋接模式可以極大的減少子類的個數,進而降低管理和維護的成本。
  • 橋接模式極大的提高了系統可擴充性,在兩個變換次元中任意擴充一個次元,都不需要修改原有的系統,符合開閉原則。

繼續閱讀