在軟件系統中,某些類型由於自身的邏輯,它具有兩個或多個維度的變化。那麼爲了應對這種“多維度的變化”(即兩個以上變化的原因)的系統,可採用Bridge模式來進行設計,使系統中類的個數更少,且系統擴展更爲方便。橋接模式將繼承關係轉換爲關聯關係,從而降低了類與類之間的耦合,減少了代碼編寫量。
二、UML圖:
三、優缺點:
優點:1)將可能變化的部分單獨封裝起來,使得變化產生的影響最小,不用編譯不必要的第代碼。
2)抽象部分和實現部分可以單獨的變動,並且每一部分的擴充都不會破壞橋樑模式搭起來架子。
3)實現細節對客戶透明
缺點:1)結構比較複雜。
2)抽象類的修改影響到子類。
四、應用場景:
現需要提供大中小3種型號的畫筆,能夠繪製5種不同顏色,如果使用蠟筆,我們需要準備3*5=15支蠟筆,也就是說必須準備15個具體的蠟筆類。而如果使用毛筆的話,只需要3種型號的毛筆,外加5個顏料盒,用3+5=8個類就可以實現15支蠟筆的功能。
實際上,蠟筆和毛筆的關鍵一個區別就在於筆和顏色是否能夠分離。即將抽象化(Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化"。關鍵就在於能否脫耦。蠟筆的顏色和蠟筆本身是分不開的,所以就造成必須使用15支色彩、大小各異的蠟筆來繪製圖畫。而毛筆與顏料能夠很好的脫耦,各自獨立變化,便簡化了操作。在這裏,抽象層面的概念是:"毛筆用顏料作畫",而在實現時,毛筆有大中小三號,顏料有紅綠藍黑白等5種,於是便可出現3×5種組合。每個參與者(毛筆與顏料)都可以在自己的自由度上隨意轉換。
蠟筆由於無法將筆與顏色分離,造成筆與顏色兩個自由度無法單獨變化,使得只有創建15種對象才能完成任務。
Bridge模式將繼承關係轉換爲組合關係,從而降低了系統間的耦合,減少了代碼編寫量。
五、代碼實現:#include <QDebug>
#define TRACE qDebug
//操作系統
class IOS
{
public:
IOS(){}
virtual ~IOS(){}
virtual void Run()=0;
};
class CWindows : public IOS
{
public:
CWindows(){}
virtual ~CWindows(){}
virtual void Run()
{
TRACE("[Window OS]!\n");
}
};
class CLinux : public IOS
{
public:
CLinux(){}
virtual ~CLinux(){}
virtual void Run()
{
TRACE("[Linux OS]!\n");
}
};
//電腦品牌
class ICompute
{
public:
ICompute(){}
virtual ~ICompute(){}
virtual void Install(IOS* pOS)=0;
};
class CIBM : public ICompute
{
public:
CIBM(){}
virtual ~CIBM(){}
virtual void Install(IOS* pOS)
{
TRACE("IBM compute install ");
pOS->Run();
}
};
class CHP : public ICompute
{
public:
CHP(){}
virtual ~CHP(){}
virtual void Install(IOS* pOS)
{
TRACE("HP compute install ");
pOS->Run();
}
};
int main()
{
IOS* pW = new CWindows();
IOS* pL = new CLinux();
ICompute* pIBM = new CIBM();
pIBM->Install(pW);
pIBM->Install(pL);
return 0;
}
六、綜述:
Bridge模式是一個非常有用的模式,也非常複雜,它很好的符合了開放-封閉原則和優先使用對象,而不是繼承這兩個面向對象原則。