Bridge橋接模式

2022-05-07 12:36:07 字數 2281 閱讀 3995

當我們的功能要在多個維度進行擴充套件時,各個維度之間可以交叉組合,就可以考慮使用橋接模式。

將抽象部分與實現部分分離,使它們都可以獨立的變化。

——《設計模式》gof 

我們看乙個實際的例子來理解:

我想發一條簡訊,首先,我要選擇使用哪一種訊號(聯通、移動、電信);其次,我們要選擇傳送的內容(文字、附件、音訊);最後,我們要選擇傳送的時間(實時、定時)。

那麼,這裡有三個維度的變化,每個維度有3、3、2種型別,如果我們使用傳統的繼承的方式來擴充套件乙個類的功能,那麼我們需要乙個頂級簡訊傳送類,3種訊號類都去繼承這個頂級類,3種內容類去繼承每一種訊號類,2種傳送時間類再去繼承每一種內容類。

這樣我們得到了3*3*2+1=19個類(或者不要頂級類,得到18個類),如果再有其他的擴充套件維度進來的話,類的個數將不堪設想。

這時我們就可以考慮使用橋接模式,使各個擴充套件維度之間解耦,使它們相互獨立。每個變化的維度都可以抽象成統一的類,由這個維度變化的子類去進行擴充套件。而各個維度的抽象類之間,可以相互持有各自的引用,從而擁有其他維度的功能。

各個變化維護的抽象類:

public

abstract

class

message

public

void

setcontent(string content)

}

public

abstract

class

signal

各個維度變化的子類:

public

class textmessage extends

message

}

public

class picmessage extends

message

}

public

class audiomessage extends

message

}

public

class yidongsignal extends

signal

@override

public

void

invoke()

}

public

class liantongsignal extends

signal

@override

public

void

invoke()

}

public

class dianxinsignal extends

signal

@override

public

void

invoke()

}

客戶端呼叫:

public

class

client

}

輸出結果:

使用【移動】:傳送【文字】資訊:hello world!

上面只擴充套件了兩個維度,如果現在我們要擴充套件第三個維度--傳送時間的話,就可以簡單的加幾個類就行了:

變化維度抽象類:

public

abstract

class

sendtime

變化維度子類:

public

class instantsendtime extends

sendtime

@override

public

void

sendmsg()

}

客戶端呼叫:

public

class

client2

}

輸出結果:

【實時傳送】-->使用【移動】:傳送【文字】資訊:hello world!

細心的讀者不難發現,在我們客戶端呼叫的時候,有點像decorator裝飾模式。

但它和decorator是有區別的,bridge是從多個維度擴充套件,而decorator是將多個包裝類的功能加在一起,組合成乙個多功能的類。(描述不太清楚,後續修改)

可以再看看decorator裝飾模式自己體味區別

橋接模式(Bridge)

個人理解 橋接模式的精髓在於維護乙個抽象物件,並抽取這個物件的抽象部分。uml類圖 實現 public inte ce icomponent public class componenta icomponent public class componentb icomponent public ab...

Bridge橋接模式

include using namespace std bridge橋接模式。class base class son1 public base 這是基類具體方法實現。class son2 public base 如果此時有了新的模組加入,或者說要實現基類的另外一些 方法,我們在這裡只需要重新建造乙...

Bridge 橋接模式

物件和行為自由組合。當不同的物件具有多種可列舉的行為,且不同行為的物件可被描述為不同的具體的物件,不同的行為與物件結合將產生大量具有差異性具體物件,為了防止對這些具體物件的列舉,將差異性的行為與物件本身分離出來。比如遊戲裡面的英雄的裝備與動作 描述不同汽車的行為 汽 油 電等不同發動機的執行方式,見...