一. 舉例
N年前:
計算機最先出來時,軟件和硬件是一綁在一起的,比如IBM出了一台電腦,上面有一個定制的系統,假如叫 IBM_Win,這個IBM_Win系統當然不能在HP電腦上運行,同樣HP出的HP_Win系統也不能運行在IBM上。
這時如果有一家新公司Apple出了一台新電腦,那麼這個公司也要開發自己的系統 Apple_Win,Apple_Linux。
其實,上面幾家公司開發的軟件和硬件在很多地方都有相似之處,如果每家公司都做自己的系統,這意味著資源和人員的極大浪費。
這時,無論出現新的系統,還是出現新的公司,對這種設計模式的修改都是很大的。
N年後:
Windows出現了,Linux出現了,軟件和硬件終於分離了。這時的系統比如 Windows 既能在IBM機器上運行,也能在HP機器上運行了。
這時軟件專注於軟件,硬件專注於硬件。這也是推動計算機系統不斷發展的原因(更加專注了嘛),也是推動更多公司出現的原因(成本更低了嘛)。
不管是出現了新硬件平台,還是出現新的OS,大家都能專注於自己領域。也就是外界的變化很大,但對這種模式沖擊卻很小。
代碼實現:
[cpp] //操作系統
class OS
{
public:
virtual void Run() {}
};
//Windows
class WindowOS: public OS
{
public:
void Run() { cout<<"運行 Windows"<<endl; }
};
//Linux
class LinuxOS: public OS
{
public:
void Run() { cout<<"運行 Linux"<<endl; }
};
//計算機
class Computer
{
public:
virtual void InstallOS(OS *os) {}
};
//IBM 計算機
class IBMComputer: public Computer
{
public:
void InstallOS(OS *os) { os->Run(); }
};
//HP 計算機
class HPComputer: public Computer
{
public:
void InstallOS(OS *os) { os->Run(); }
};
int main()
{
OS *os1 = new WindowOS();
OS *os2 = new LinuxOS();
Computer *computer1 = new IBMComputer();
computer1->InstallOS(os1);
computer1->InstallOS(os2);
return 0;
}
//操作系統
class OS
{
public:
virtual void Run() {}
};
//Windows
class WindowOS: public OS
{
public:
void Run() { cout<<"運行 Windows"<<endl; }
};
//Linux
class LinuxOS: public OS
{
public:
void Run() { cout<<"運行 Linux"<<endl; }
};
//計算機
class Computer
{
public:
virtual void InstallOS(OS *os) {}
};
//IBM 計算機
class IBMComputer: public Computer
{
public:
void InstallOS(OS *os) { os->Run(); }
};
//HP 計算機
class HPComputer: public Computer
{
public:
void InstallOS(OS *os) { os->Run(); }
};
int main()
{
OS *os1 = new WindowOS();
OS *os2 = new LinuxOS();
Computer *computer1 = new IBMComputer();
computer1->InstallOS(os1);
computer1->InstallOS(os2);
return 0;
}
二. 橋接模式
定義:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
換句話出,就是要把實現獨立出來,讓它們各自變化,而不會影響其它實現,這樣可以降低耦合性。
為什麼叫Bridge 模式,從上圖中可以看出,它像一座橋,橋兩邊的系統相對獨立,左邊是抽象部分,右邊是實現部分。
三. 組合、聚合復用原則
由上面兩個種結構圖的對比,我們可以引出一個原則:盡量使用組合、聚合,盡量不要使用類繼承。
作者 lwbeyond