概念
Bridge 模式又叫做橋接模式,是構造型的設計模式之一。Bridge模式基于類的最小設計原則,通過使用封裝,聚合以及繼承等行為來讓不同的類承擔不同的責任。它的主要特點是把抽象(abstraction)與行為實現(implementation)分離開來,從而可以保持各部分的獨立性以及應對它們的功能擴展。
?
角色和職責
Client
??? Bridge模式的使用者
Abstraction
??? 抽象類接口(接口或抽象類)維護對行為實現(Implementor)的引用
Refined Abstraction
??? Abstraction子類
Implementor
??? 行為實現類接口 (Abstraction接口定義了基于Implementor接口的更高層次的操作)
ConcreteImplementor
Implementor子類
?
?適用于:
橋接模式(Bridge?Pattern)是將抽象部分與實現部分分離(解耦合),使它們都可以獨立的變化。
???????? 車 安裝 發動機 ;不同型號的車,安裝不同型號的發動機
???????? 圖形 填 顏色 ???不同形狀的圖形,填充上 不同的顏色
將“車 安裝 發動機”這個抽象 和 實現進行分離;兩個名字 就設計兩個類;
將“圖形 填 顏色”這個抽象 和 實現 進行分離,兩個名字,就設計兩個類
?
?
案例
//不同的車型,不同型號,安裝不同類型的發動機
#include <iostream>
using namespace std;class MyCar1
{
public:virtual void installEngine() = 0;
};class BMW5 : public MyCar1
{
public:virtual void installEngine(){cout << "BMW5 3500CC" << endl;}
};class BMW6 : public MyCar1
{
public:virtual void installEngine(){cout << "BMW6 4000CC" << endl;}
};class Jeep11 : public MyCar1
{
public:virtual void installEngine(){cout << "Jeep11 1100CC" << endl;}
};class Jeep12 : public MyCar1
{
public:virtual void installEngine(){cout << "Jeep12 1200CC" << endl;}
};//不同的車型,不同型號,安裝不同類型的發動機,會引起子類的泛濫
//問題引出
void main1601()
{Jeep12 *j12 = new Jeep12;j12->installEngine();delete j12;return ;
}class MyCar2
{public:virtual void installEngine3500() = 0;virtual void installEngine4000() = 0;virtual void installEngine1100() = 0;virtual void installEngine1200() = 0;
};class BMW : public MyCar2
{
public:virtual void installEngine3500(){cout << "3500CC" << endl;}virtual void installEngine4000(){cout << "4000CC" << endl;}virtual void installEngine1100() {cout << "1100CC" << endl;}virtual void installEngine1200(){cout << "1200CC" << endl;}
};//這樣的設計 不符合開閉原則
void main1602()
{BMW *bmw5 = new BMW;bmw5->installEngine3500();
}//需要把“安裝發動機”這個事,做很好的分解;把抽象 和 行為實現 分開
//發動機是一個名次,專門抽象成一個類;類中含有一個成員函數,安裝發動機class Engine
{
public:virtual void installEngine() = 0;
};class Engine4000 : public Engine
{
public:virtual void installEngine(){cout << "安裝發動機 Engine4000" << endl;}
};class Engine3500 : public Engine
{
public:virtual void installEngine(){cout << "安裝發動機 Engine 3500" << endl;}
};class Car
{
public:Car(Engine *pengine){m_engine = pengine;}virtual void installEngine() = 0;protected:Engine *m_engine;
};class BMW7 :public Car
{
public:BMW7(Engine *p) : Car(p){}//注意車的安裝 和 發動機的安裝 不同之處virtual void installEngine(){cout << "BMW7 " ; m_engine->installEngine();}
protected:
private:
};void main163()
{Engine4000 *e4000 = new Engine4000;BMW7 *bmw7 = new BMW7(e4000);bmw7->installEngine();delete bmw7;delete e4000;
}
void main()
{//main1601();//main1602();main163();system("pause");
}
?