Java橋接模式怎么使用

這篇文章主要介紹“Java橋接模式怎么使用”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Java橋接模式怎么使用”文章能幫助大家解決問題。

成都創(chuàng)新互聯(lián)作為成都網(wǎng)站建設(shè)公司,專注網(wǎng)站建設(shè)公司、網(wǎng)站設(shè)計(jì),有關(guān)成都企業(yè)網(wǎng)站定制方案、改版、費(fèi)用等問題,行業(yè)涉及成都生料攪拌車等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

Java橋接模式怎么使用

其實(shí)在現(xiàn)實(shí)生活中,有很多類可以有兩個(gè)或多個(gè)維度的變化,如圖形既可按形狀分,又可按顏色分,如果用繼承方式,m 種形狀和 n 種顏色的圖形就有 m*n 種,不但對(duì)應(yīng)的子類很多,而且擴(kuò)展比較困難。

比如不同顏色和字體的文字、不同品牌和功率的汽車、不同性別和職業(yè)的男女、支持不同平臺(tái)和不同文件格式的媒體播放器等。如果用橋接模式就能很好地解決這些問題。


1、橋接模式的定義

將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來實(shí)現(xiàn),從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度

模式類型:結(jié)構(gòu)設(shè)計(jì)模式

原理類圖:
Java橋接模式怎么使用
原理類圖說明:

  1. Client類:橋接模式的調(diào)用者

  2. 抽象類(Abstraction) :維護(hù)了Implementor/即它的實(shí)現(xiàn)類ConcretelmplementorA…二者是器合關(guān)系,Abstraction充當(dāng)橋接英

  3. RehinedAbstraction:是Abstraction抽象類的子類lmplementor:行為實(shí)現(xiàn)類的接口

  4. ConcretelmplementorA/B:行為的具體實(shí)現(xiàn)類

  5. 從UML圖:這里的抽象類和接口是聚合的關(guān)系,其實(shí)調(diào)用和被調(diào)用關(guān)系


2、橋接模式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  1. 抽象與實(shí)現(xiàn)分離,擴(kuò)展能力強(qiáng)

  2. 符合開閉原則

  3. 符合合成復(fù)用原則

  4. 其實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶透明

缺點(diǎn):

  • 由于聚合關(guān)系建立在抽象層,要求開發(fā)者針對(duì)抽象化進(jìn)行設(shè)計(jì)與編程,能正確地識(shí)別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度,這增加了系統(tǒng)的理解與設(shè)計(jì)難度


3、橋接模式的結(jié)構(gòu)

橋接(Bridge)模式包含以下主要角色:

  1. 抽象化(Abstraction)角色:定義抽象類,并包含一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用

  2. 擴(kuò)展抽象化(Refined Abstraction)角色:是抽象化角色的子類,實(shí)現(xiàn)父類中的業(yè)務(wù)方法,并通過組合關(guān)系調(diào)用實(shí)現(xiàn)化角色中的業(yè)務(wù)方法

  3. 實(shí)現(xiàn)化(Implementor)角色:定義實(shí)現(xiàn)化角色的接口,供擴(kuò)展抽象化角色調(diào)用

  4. 具體實(shí)現(xiàn)化(Concrete Implementor)角色:給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)

結(jié)構(gòu)圖:

Java橋接模式怎么使用
該結(jié)構(gòu)圖的實(shí)現(xiàn)代碼:

實(shí)視化角色:

/**
 * 實(shí)視化角色
 */public interface Implemntor {

    public void OperationImpl();}

具體實(shí)現(xiàn)化角色:

/**
 * 具體實(shí)現(xiàn)化角色
 */public class ConcreteImplementorA implements Implemntor{
    @Override
    public void OperationImpl() {
        System.out.println("具體實(shí)現(xiàn)化角色被訪問");
    }}

抽象化角色:

/**
 * 抽象化角色
 */public abstract class Abstraction {

    protected Implemntor implemntor;

    protected Abstraction(Implemntor implemntor){
        this.implemntor = implemntor;
    }

    public abstract void Operation();}

擴(kuò)展抽象化角色:

/**
 * 擴(kuò)展抽象化角色
 */public class RefinedAbstraction extends Abstraction{

    protected RefinedAbstraction(Implemntor implemntor) {
        super(implemntor);
    }

    public void Operation(){
        System.out.println("擴(kuò)展抽象化角色被訪問");
        implemntor.OperationImpl();
    }}

測(cè)試類:

public class Test {
    public static void main(String[] args) {

        Implemntor implemntor = new ConcreteImplementorA();
        Abstraction abs = new RefinedAbstraction(implemntor);
        abs.Operation();

    }}

輸出:

擴(kuò)展抽象化角色被訪問
具體實(shí)現(xiàn)化角色被訪問

4 、橋接模式的案例實(shí)現(xiàn)

將實(shí)現(xiàn)與抽象放在兩個(gè)不同的類層次中,使兩個(gè)層次可以獨(dú)立改變

交通工具在路上行駛,這里有兩個(gè)維度的變化,交通工具的類型不同,路也分水泥路和柏油路

類圖:
Java橋接模式怎么使用

交通工具類:

/**
 * 交通工具類
 */public interface Vehicle {

    public void drive();}

具體的交通工具:小汽車

/**
 * 具體的交通工具:小汽車
 */public class Car implements Vehicle{
    @Override
    public void drive() {
        System.out.println("小汽車");
    }}

具體的交通工具:大巴車

/**
 * 具體的交通工具:大巴車
 */public class Bus implements Vehicle{
    @Override
    public void drive() {
        System.out.println("大巴車");
    }}

抽象的路:

/**
 * 抽象的路
 */public abstract class Road {

    protected Vehicle vehicle;

    public Road(Vehicle vehicle){
        this.vehicle = vehicle;
    }

    public abstract void driveOnRoad();}

具體的路:油柏路

/**
 * 具體的路:油柏路
 */public class UnpavedRoad extends Road{
    public UnpavedRoad(Vehicle vehicle) {
        super(vehicle);
    }

    @Override
    public void driveOnRoad() {

        super.vehicle.drive();
        System.out.println("行駛在油柏路");
    }}

具體的路:水泥路

/**
 * 具體的路:水泥路
 */public class CementRoad extends Road{
    public CementRoad(Vehicle vehicle) {
        super(vehicle);
    }

    @Override
    public void driveOnRoad() {
        super.vehicle.drive();
        System.out.println("行駛在水泥路");
    }}

測(cè)試類:

//測(cè)試public class Test {
    public static void main(String[] args) {

        Road roadCar = new CementRoad(new Car());
        roadCar.driveOnRoad();

        Road roadBus = new CementRoad(new Bus());
        roadBus.driveOnRoad();

    }}

輸出:

小汽車
行駛在水泥路
大巴車
行駛在水泥路

5、橋接模式的注意事項(xiàng)

  1. 實(shí)現(xiàn)了抽象和實(shí)現(xiàn)部分的分離,從而極大的提供了系統(tǒng)的靈活性,讓抽象部分和實(shí)現(xiàn)部分獨(dú)立開來,這有助于系統(tǒng)進(jìn)行分層設(shè)計(jì),從而產(chǎn)生更好的結(jié)構(gòu)化系統(tǒng)

  2. 對(duì)于系統(tǒng)的高層部分,只需要知道抽象部分和實(shí)現(xiàn)部分的接口就可以了,其它的部分由具體業(yè)務(wù)來完成

  3. 橋接模式替代多層繼承方案,可以減少子類的個(gè)數(shù),降低系統(tǒng)的管理和維護(hù)成本

  4. 橋接模式的引入增加了系統(tǒng)的理解和設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對(duì)抽象進(jìn)行設(shè)計(jì)和編程

  5. 橋接模式要求正確識(shí)別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度,因此其使用范圍有一定的局限性,即需要有這樣的應(yīng)用場(chǎng)景


6、橋接模式應(yīng)用場(chǎng)景

對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個(gè)數(shù)急劇增加的系統(tǒng),橋接模式尤為適用.

關(guān)于“Java橋接模式怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

當(dāng)前文章:Java橋接模式怎么使用
URL標(biāo)題:http://bm7419.com/article32/psdgsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序響應(yīng)式網(wǎng)站、軟件開發(fā)、營(yíng)銷型網(wǎng)站建設(shè)、商城網(wǎng)站、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站