設計模式讀書筆記(四) Bridge(橋樑)模式
阿新 • • 發佈:2019-02-11
一、模式介紹
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上下載:
這裡寫連結內容