源代碼:https://gitee.com/AgentXiao/BridgePattern
要點(diǎn):
1、解決的問題
2、實(shí)現(xiàn)的方法
一、運(yùn)用場景
用于解決多重繼承中違反類的單一職責(zé)問題。

擴(kuò)展性問題(類個(gè)數(shù)膨脹問題)
如上圖,每一個(gè)方框都是一個(gè)類,如果我需要增加電腦類型,則相應(yīng)地要添加這個(gè)類型的三種品牌;如果我需要增加一種品牌,每一種類型都要增加這種品牌。
違反類的單一職責(zé)問題
一個(gè)類影響的因素有多種,例如聯(lián)想臺式機(jī),既是聯(lián)想品牌又是臺式機(jī)。
二、橋接模式

要點(diǎn):
1)類型和品牌是分開的
2)橋接:每一種類型都關(guān)聯(lián)了所有的品牌(表示類型的類中有品牌屬性)
三、實(shí)現(xiàn)
對于品牌維度:
/**
* @interfaceName Brand
* @Description 電腦品牌
* @Author xwd
* @Date 2018/10/24 11:47
*/
public interface Brand {
/**
* @MethodName sale
* @Descrition 銷售品牌
* @Param []
* @return String
*/
public String sale();
}
/**
* @ClassName Lenovo
* @Description 聯(lián)想
* @Author xwd
* @Date 2018/10/24 11:49
*/
public class Lenovo implements Brand{
@Override
public String sale() {
return "聯(lián)想";
}
}
/**
* @ClassName Shenzhou
* @Description 神舟
* @Author xwd
* @Date 2018/10/24 11:51
*/
public class Shenzhou implements Brand{
@Override
public String sale() {
return "神舟";
}
}
對于類型維度:
/**
* @ClassName Computer
* @Description 電腦類型
* @Author xwd
* @Date 2018/10/24 11:47
*/
public class Computer {
protected Brand brand;//橋接電腦品牌
public Computer(Brand brand) {
this.brand = brand;
}
/**
* @MethodName sale
* @Descrition 銷售電腦類型
* @Param []
* @return String
*/
public String sale(){
return brand.sale();
}
}
橋接模式的核心就在于在類型維度中,有品牌的屬性,在創(chuàng)建一個(gè)類型對象時(shí),將相應(yīng)的品牌傳進(jìn)來。
/**
* @ClassName Desktep
* @Description 臺式電腦
* @Author xwd
* @Date 2018/10/24 11:54
*/
public class Desktep extends Computer{
public Desktep(Brand brand) {
super(brand);
}
@Override
public String sale() {
return "銷售"+super.sale()+"臺式電腦";
}
}
/**
* @ClassName Desktep
* @Description 平板電腦
* @Author xwd
* @Date 2018/10/24 11:54
*/
public class Pad extends Computer{
public Pad(Brand brand) {
super(brand);
}
@Override
public String sale() {
return "銷售"+super.sale()+"平板電腦";
}
}
使用:
/**
* @ClassName Client
* @Description 客戶
* @Author xwd
* @Date 2018/10/24 11:58
*/
public class Client {
public static void main(String[] args) {
//創(chuàng)建聯(lián)想臺式電腦對象
Computer computer = new Desktep(new Lenovo());
System.out.println(computer.sale());
}
}
由此分析,橋接模式使得每個(gè)類符合單一職責(zé)原則,影響該類的要么是類型要么是品牌。同時(shí),如果增加一種類型,只需要增加該類型的類并繼承Computer類,由于Computer類中橋接了品牌,那么新的種類自動(dòng)擁有了所有的品牌;如果增加一個(gè)品牌,只需要增加一個(gè)品牌類實(shí)現(xiàn)Brand接口,所有的種類會自動(dòng)引用。解決了擴(kuò)展性問題。

四、總結(jié)
(1)橋接模式可以取代多層繼承的方案。 多層繼承違背了單一職責(zé)原則,復(fù)用性較差,類的個(gè)數(shù)也非常多。橋接模式可以極大的減少子類的個(gè)數(shù),從而降低管理和維護(hù)的成本。
(2)橋接模式極大的提高了系統(tǒng)可擴(kuò)展性,在兩個(gè)變化維度中任意擴(kuò)展一個(gè)維度,都不需要修改原有的系統(tǒng),符合開閉原則。
(3)在實(shí)際開發(fā)中的應(yīng)用場景
JDBC驅(qū)動(dòng)程序
AWT中的Peer架構(gòu)
銀行日志管理
? 格式分類:操作日志、交易日志、異常日志
? 距離分類:本地記錄日志、異地記錄日志
人力資源系統(tǒng)中的獎(jiǎng)金計(jì)算模塊
? 獎(jiǎng)金分類:個(gè)人獎(jiǎng)金、團(tuán)體獎(jiǎng)金、激勵(lì)獎(jiǎng)金。
? 部門分類:人事部門、銷售部門、研發(fā)部門。
OA系統(tǒng)中的消息處理
? 業(yè)務(wù)類型:普通消息、加急消息、特急消息
? 發(fā)送消息方式:系統(tǒng)內(nèi)消息、手機(jī)短信、郵件