Bridge橋接模式是一種結構型模式,它主要應對的是:由于類(lèi)型的固有羅輯,使得類(lèi)型具有兩個(gè)或兩個(gè)以上的緯度變化。也就是要求抽象不應依賴(lài)于實(shí)現細節,實(shí)現細節應依賴(lài)于抽象。
《設計模式》中說(shuō)到將抽象部分與實(shí)現部分分離,使他們可以獨立的變化。
舉個(gè)例子更清楚些,好像我們平時(shí)玩的游戲中有PS版的,但是不是大家都有PS。這時(shí)我們等一段時(shí)間,一般會(huì )出PC版的或其他版本。由于支持游戲的平臺不一樣,但是如果我們編寫(xiě)的游戲程序為了適應另一種平臺就要全部重新編寫(xiě)的話(huà)豈不是很麻煩。再加上游戲本身的變動(dòng),一句眾人皆知的話(huà):“死定了”。
現在我們來(lái)看看Bridge橋接模式,看看它是如何解決類(lèi)似問(wèn)題的,首先我們看看Bridge模式的結構。

實(shí)際上,我們要做到的是把變化的部分提出,對其抽象,使變化獨立。那我們如何做呢?通過(guò)組合的方式將變化獨立出去。將一個(gè)事物中的多個(gè)緯度變化分離。
下面舉一個(gè)場(chǎng)景來(lái)理解一下,還是用汽車(chē)舉例,我現在要一輛車(chē)(BMW或BORA)在路(WaterRoad或Cement)上跑?,F在有兩個(gè)緯度的變化點(diǎn):汽車(chē)和路。也就是上圖中的AbstractChangePoint1和AbstractChangePoint2。AbstractChangePoint1中包含有AbstractChangePoint2對象成員。。代碼實(shí)現如下:
abstract class AbstractCar
{
public AbstractRoad road;
public AbstractCar(AbstractRoad road)
{
this.road = road;
}
public abstract string Run();
public abstract string Stop();
}
abstract class AbstractRoad
{
public abstract string GetRoadType();
}
以汽車(chē)為變化中心,用組裝的方式將兩個(gè)變化點(diǎn)結合起來(lái)。使路的變化和汽車(chē)隔離。下面來(lái)編寫(xiě)路的實(shí)現。
class WaterRoad:AbstractRoad
{
public override string GetRoadType()
{
return "It is WaterRoad";
}
}
class CementRoad:AbstractRoad
{
public override string GetRoadType()
{
return "It is Cement";
}
}
然后再來(lái)編寫(xiě)汽車(chē)的實(shí)現
class BMWCar:AbstractCar
{
public BMWCar(AbstractRoad road)
: base(road)
{
}
public override string Run()
{
return "BMW is running";
}
public override string Stop()
{
return "BMW is stopped";
}
}
class BROACar:AbstractCar
{
public BROACar(AbstractRoad road)
: base(road)
{
}
public override string Run()
{
return "BROA is running";
}
public override string Stop()
{
return "BROA is stopped";
}
}
然后我們在客戶(hù)代碼中調用這些類(lèi),首先,我想要這個(gè)場(chǎng)景是BMW在WaterRoad上跑,客戶(hù)端代碼如下:
static void
{
AbstractCar car = new BMWCar(new WaterRoad());
Console.WriteLine(car.road.GetRoadType());
Console.WriteLine(car.Run());
Console.WriteLine(car.Stop());
Console.Read();
}
實(shí)現結果如下:
It is WaterRoad
BMW is running
BMW is stopped
如果我現在要一輛BORA在Cement上跑,我們只要稍微修改一下car的實(shí)例化就可以,代碼如下:
static void
{
AbstractCar car = new BROACar(new CementRoad());
Console.WriteLine(car.road.GetRoadType());
Console.WriteLine(car.Run());
Console.WriteLine(car.Stop());
Console.Read();
}
實(shí)現結果如下:
It is Cement
BROA is running
BROA is stopped
最后我們再來(lái)說(shuō)說(shuō)Bridge模式的要點(diǎn):
1、Bridge模式使用“對象間的組合關(guān)系”解耦了抽象和實(shí)現之間固有的綁定關(guān)系,使得抽象和實(shí)現可以沿著(zhù)各自的緯度來(lái)變化。
2、所謂抽象和實(shí)現沿著(zhù)各自緯度的變化,即“子類(lèi)化”它們,得到各個(gè)子類(lèi)之后,便可以任意組合它們。
3、Bridge模式有時(shí)候類(lèi)似于多繼承方案,但是多繼承方案往往違背單一職責原則(即一個(gè)類(lèi)只有一個(gè)變化的原因),復用性比較差。Bridge模式是比多繼承方案更好的解決方法。
4、Bridge模式的應用一般在“兩個(gè)非常強的變化緯度”,有時(shí)候即使有兩個(gè)變化的緯度,但是某個(gè)方向的變化緯度并不劇烈——換言之兩個(gè)變化不會(huì )導致縱橫交錯的結果,并不一定要使用Bridge模式。

