天天看點

設計模式【7】-- 探索一下橋接模式

設計模式,寫代碼必備神器...

設計模式【7】-- 探索一下橋接模式

橋接模式是什麼?

橋接模式是把抽象化和實作化解耦,讓兩者可以獨立,該設計模式屬于結構性設計模式。何為将抽象化和實作化解耦,可以了解為将功能點抽象出來,功能的實作如何取決于不同的需求,但是抽象的功能點(接口)已經被橋接到原本的類型上,隻用關注與實作。原本的類型變化,和抽象的功能點可以自由變化,中間的橋梁已經搭建起來了。

橋接模式其實就是不單單使用類繼承的方式,而是重點使用類聚合的方式,進行橋接,把抽象的功能點,聚合(注入)到基類裡面。

橋接模式的好處

一般用于解決什麼問題呢?

主要是功能點實作種類多,多個次元的功能點,獨立變化,沒有什麼關聯,可以按照次元來管理。比如有 2 個次元,每個次元有 3 種實作,但是不同的次元之間其實沒有關聯,如果按照次元之間兩兩關聯來搞,單單是實作類的數量就已經

2 * 3 = 6

個類了,是在不太合适,還耦合在一塊。

用電腦舉個例子,既會分成不同的品牌,比如戴爾,聯想,又會分為桌上型電腦,筆記本,那麼不同的類就會很多,功能可能比較重複。正是鑒于這一點,我們得剝離重複的功能,用橋接的方式,來維護抽象出來的共同功能點。

設計模式【7】-- 探索一下橋接模式

如果再新增一個品牌,比如,華碩,那麼又得增加兩個類,這明顯不太合适,不同的類很多功能可能會重複。

設計模式【7】-- 探索一下橋接模式

那麼橋接模式怎麼處理呢?橋接模式把兩個不同的次元 桌上型電腦 和 筆記本抽取出來,相當于作為一個通用的屬性來維護。

設計模式【7】-- 探索一下橋接模式

代碼Demo示範

首先,定義一個抽象的電腦類

AbstractComputer

,在其中有一個屬性是

ComputerType

,表示電腦的類型:

public abstract class AbstractComputer {

    protected ComputerType type;

    public void setType(ComputerType type) {
        this.type = type;
    }

    public abstract void work();
}
           

再定義三種類型的電腦:

LenovoComputer

,

AsusComputer

DellComputer

:

public class LenovoComputer extends AbstractComputer{

    @Override
    public void work() {
        System.out.print("聯想");
        type.feature();
    }
}
           
public class AsusComputer extends AbstractComputer{
    @Override
    public void work() {
        System.out.print("華碩");
        type.feature();
    }
}
           
public class DellComputer extends AbstractComputer{
    @Override
    public void work() {
        System.out.print("戴爾");
        type.feature();
    }
}
           

電腦類型這個次元同樣需要一個抽象類

ComputerType

,裡面有一個說明功能的方法

feature()

public abstract class ComputerType {
    // 功能特性
    public abstract void feature();
}
           

電腦類型這個次元,我們定義桌上型電腦和筆記本電腦兩種:

public class DesktopComputerType extends ComputerType{
    @Override
    public void feature() {
        System.out.println(" 桌上型電腦:性能強大,拓展性強");
    }
}
           
public class LaptopComputerType extends ComputerType{
    @Override
    public void feature() {
        System.out.println(" 筆記本電腦:小巧便攜,辦公不在話下");
    }
}
           

測試一下,我們需要不同的搭配的時候,隻需要将一個次元

set

到對象中去即可,就可以聚合出不同品牌不同類型的電腦:

public class BridgeTest {
    public static void main(String[] args) {
        ComputerType desktop = new DesktopComputerType();
        LenovoComputer lenovoComputer = new LenovoComputer();
        lenovoComputer.setType(desktop);
        lenovoComputer.work();

        ComputerType laptop = new LaptopComputerType();
        DellComputer dellComputer = new DellComputer();
        dellComputer.setType(laptop);
        dellComputer.work();
    }
}
           

測試結果:

聯想 桌上型電腦:性能強大,拓展性強
戴爾 筆記本電腦:小巧便攜,辦公不在話下
           

總結一下

橋接模式,本質上就是将不同次元或者說功能,抽象出來,作為屬性,聚合到對象裡面,而不是通過繼承。這樣一定程度上減少了類的數量,但是如果不同的次元之間,變化是相關聯的,這樣使用起來還需要再做各種特殊判斷,使用起來容易造成混亂,不宜使用。(重點:用組合/聚合關系代替繼承關系來實作)

JDBC

,搞過

Java

的同學應該都知道,這是一種

Java

統一通路資料庫的

API

,可以操作

Mysql

Oracle

等,主要用到的設計模式也是橋接模式,有興趣可以了解一下

Driver

驅動類管理的源碼。

【作者簡介】:

秦懷,公衆号【秦懷雜貨店】作者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。個人寫作方向:

Java源碼解析

JDBC

Mybatis

Spring

redis

分布式

劍指Offer

LeetCode

等,認真寫好每一篇文章,不喜歡标題黨,不喜歡花裡胡哨,大多寫系列文章,不能保證我寫的都完全正确,但是我保證所寫的均經過實踐或者查找資料。遺漏或者錯誤之處,還望指正。

劍指Offer全部題解PDF

開源程式設計筆記

繼續閱讀