C++設計模式實現--橋模式

一、概述:
        在軟件系統中,某些類型由於自身的邏輯,它具有兩個或多個維度的變化。那麼爲了應對這種“多維度的變化”(即兩個以上變化的原因)的系統,可採用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模式是一個非常有用的模式,也非常複雜,它很好的符合了開放-封閉原則和優先使用對象,而不是繼承這兩個面向對象原則。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章