简介
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的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;
}