當我們的功能要在多個維度進行擴充套件時,各個維度之間可以交叉組合,就可以考慮使用橋接模式。
將抽象部分與實現部分分離,使它們都可以獨立的變化。
——《設計模式》gof
我們看乙個實際的例子來理解:
我想發一條簡訊,首先,我要選擇使用哪一種訊號(聯通、移動、電信);其次,我們要選擇傳送的內容(文字、附件、音訊);最後,我們要選擇傳送的時間(實時、定時)。
那麼,這裡有三個維度的變化,每個維度有3、3、2種型別,如果我們使用傳統的繼承的方式來擴充套件乙個類的功能,那麼我們需要乙個頂級簡訊傳送類,3種訊號類都去繼承這個頂級類,3種內容類去繼承每一種訊號類,2種傳送時間類再去繼承每一種內容類。
這樣我們得到了3*3*2+1=19個類(或者不要頂級類,得到18個類),如果再有其他的擴充套件維度進來的話,類的個數將不堪設想。
這時我們就可以考慮使用橋接模式,使各個擴充套件維度之間解耦,使它們相互獨立。每個變化的維度都可以抽象成統一的類,由這個維度變化的子類去進行擴充套件。而各個維度的抽象類之間,可以相互持有各自的引用,從而擁有其他維度的功能。
各個變化維護的抽象類:
publicabstract
class
message
public
void
setcontent(string content)
}
publicabstract
class
signal
各個維度變化的子類:
publicclass textmessage extends
message
}
publicclass picmessage extends
message
}
publicclass audiomessage extends
message
}
publicclass yidongsignal extends
signal
@override
public
void
invoke()
}
publicclass liantongsignal extends
signal
@override
public
void
invoke()
}
publicclass dianxinsignal extends
signal
@override
public
void
invoke()
}
客戶端呼叫:
publicclass
client
}
輸出結果:
使用【移動】:傳送【文字】資訊:hello world!
上面只擴充套件了兩個維度,如果現在我們要擴充套件第三個維度--傳送時間的話,就可以簡單的加幾個類就行了:
變化維度抽象類:
publicabstract
class
sendtime
變化維度子類:
publicclass instantsendtime extends
sendtime
@override
public
void
sendmsg()
}
客戶端呼叫:
publicclass
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 橋接模式
物件和行為自由組合。當不同的物件具有多種可列舉的行為,且不同行為的物件可被描述為不同的具體的物件,不同的行為與物件結合將產生大量具有差異性具體物件,為了防止對這些具體物件的列舉,將差異性的行為與物件本身分離出來。比如遊戲裡面的英雄的裝備與動作 描述不同汽車的行為 汽 油 電等不同發動機的執行方式,見...