1. 程式人生 > >設計模式讀書筆記(四) Bridge(橋樑)模式

設計模式讀書筆記(四) Bridge(橋樑)模式

一、模式介紹

GOF 在《設計模式》中給橋樑模式的定義為:將抽象部分與它的實現部分分離,使它 們都可以獨立地變化。這裡的抽象部分和實現部分不是我們通常認為的父類與子類、介面與 實現類的關係,而是組合關係。也就是說,實現部分是被抽象部分呼叫,以用來完成(實現) 抽象部分的功能

簡單來說,橋樑模式就是為了降低耦合,讓抽象與實現相分離,使得兩者都能夠各自變化

二、例子實現

假設我現在有兩臺電腦,一臺是預裝windows系統的,一臺是預裝ios系統的,其實可以用繼承來實現不同的電腦和系統,但是如果是我要生產出3個品牌的電腦,然後每個品牌的電腦有3個不同的系統進行預售,很好理解,如果是繼承的方式,我們需要9個子類,但是如果是採用了橋樑的模式,我們就只需要6個子類即可。下面我們來看一個簡單的例子:

我們需要有一個Computer的父類,來定義每一臺電腦公共的屬性,另外,還需要有一個OS的類來實現每一臺電腦預裝的系統:

class OS;

class Computer
{
public:
    Computer(){};
    virtual ~Computer(){};

    virtual void InstallOS(OS *os) = 0;

protected:
    OS *operaSystem;
};


class Apple :public Computer
{
public :
    Apple();
    ~Apple();

    void
InstallOS(OS *os); }; class Microsoft :public Computer { public: Microsoft(); ~Microsoft(); void InstallOS(OS *os); };
class OS
{
public:
    OS(){};
    virtual ~OS(){};

    virtual void Work() = 0;
};


class Windows :public OS
{
public:
    Windows();
    ~Windows();

    void
Work(); }; class IOS :public OS { public: IOS(); ~IOS(); void Work(); };

下面是實現的部分:

IOS::IOS() :OS()
{

}

IOS::~IOS()
{

}

void IOS::Work()
{
    cout << "I'm working with IOS " << endl;
}


Windows::Windows() :OS()
{

}

Windows::~Windows()
{

}

void Windows::Work()
{
    cout << "I'm working with Windows " << endl;
}
Apple::Apple() :Computer()
{
    cout << "I'm Mac!" << endl;
}

Apple::~Apple()
{
    if (operaSystem)
        delete operaSystem;
}

void Apple::InstallOS(OS *os)
{
    operaSystem = os;
    operaSystem->Work();
}

Microsoft::Microsoft() :Computer()
{
    cout << "I'm Microsoft!" << endl;
}

Microsoft::~Microsoft()
{
    if (operaSystem)
        delete operaSystem;
}

void Microsoft::InstallOS(OS *os)
{
    operaSystem = os;
    operaSystem->Work();
}

接下來是呼叫部分:

#include "OS.h"
#include "Computer.h"

int main()
{
    Computer *lenovo = new Microsoft();
    lenovo->InstallOS(new Windows());

    Computer *Mac = new Apple();
    Mac->InstallOS(new IOS());

    delete lenovo;
    delete Mac;
    getchar();
}

這樣就實現了抽象和實現的分離,關於這次的程式碼,可以到github上下載:
這裡寫連結內容