【Java設(shè)計(jì)模式】結(jié)構(gòu)型模式-橋接模式

源代碼: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ò)展性問題。

BridgePattern.png

四、總結(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ī)短信、郵件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容