橋接模式(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();
}
}
橋接模式案例圖:
應用場景
- JDBC驅動程式
- AWT中的Peer架構
- 銀行日志管理:
- 格式分類:記錄檔、交易日志、異常日志
- 距離分類:本地記錄日志、異地記錄日志
- 人類資源系統中的獎金計算子產品:
- 獎金分類:個人獎金、團隊獎金、激勵獎金
- 部門分類:人事部門、銷售部門、研發部門
- OA系統中的消息處理:
- 業務類型:普通消息、加急消息、特急消息
- 發生消息方式:系統内消息、短信、郵件
總結
- 橋接模式可以取代多層繼承的方案。多層繼承違背了單一職責原則,複用性較差,類的個數也非常多。橋接模式可以極大的減少子類的個數,進而降低管理和維護的成本。
- 橋接模式極大的提高了系統可擴充性,在兩個變換次元中任意擴充一個次元,都不需要修改原有的系統,符合開閉原則。