簡介
橋接模式就是把事物和其具體實作分開,使他們可以各自獨立的變化。橋接的用意是:将抽象化與實作化解耦,使得二者可以獨立變化,像我們常用的JDBC橋DriverManager一樣,JDBC進行連接配接資料庫的時候,在各個資料庫之間進行切換,基本不需要動太多的代碼,甚至絲毫不用動,原因就是JDBC提供統一接口,每個資料庫提供各自的實作,用一個叫做資料庫驅動的程式來橋接就行了。
角色與職責
Clinet:
Bridge模式的使用者。
CAbstraction:
抽象類接口,維護對行為實作(Implementor)的引用。
RefinedAbstraction
CAbstraction的子類。
implementor:
行為實作類接口(CAstraction接口定義了基于Implementor接口的更高層的操作,如車與發動機的關系,CAstraction對于車,Implementor對應發動機)。
ConcreteImplementor
Implementor的子類。
使用場景:
實作系統可能有多個角度分類,每一種角度都可能變化。即多對多關系中。
實作
#include <iostream>
#include <string>
using namespace std;
class Engine {
public:
virtual void installEngine() = 0;
};
class Engine1100c : public Engine {
public:
virtual void installEngine() {
cout << "I'm 1100c Engine, wellcome to use" << endl;
}
};
class Engine4400c : public Engine {
public:
virtual void installEngine() {
cout << "I'm 4400c Engine, wellcome to use" << endl;
}
};
class Car {
public:
Car(Engine* engine) :m_engine(engine) {}
virtual void installEngine() = 0;
protected:
Engine* m_engine;
};
class BWM5 : public Car{
public:
BWM5(Engine* engine) : Car(engine) { }
virtual void installEngine() {
cout << "I'm BWM5" << endl;
m_engine->installEngine();
}
};
class BWM7 : public Car {
public:
BWM7(Engine* engine) : Car(engine) { }
virtual void installEngine() {
cout << "I'm BWM7" << endl;
m_engine->installEngine();
}
};
int main(int argc, char* argv[]) {
Engine* engine = NULL;
Car* car = NULL;
engine = new Engine1100c;
car = new BWM5(engine);
car->installEngine();
delete engine;
delete car;
engine = new Engine4400c;
car = new BWM7(engine);
car->installEngine();
cin.get();
return 0;
}