01 桥模式的用途
若一个类具有两种属性:属性A和属性B。其中A属性有三种B属性有四种。那么实际需要编写的类的个数为3*4 = 12
如果我们把具体的类抽象成一种需要装载两种属性的模具,那么需要编写的代码就大大减少。
02 构建方法
以两种属性为例
- 构建属性A的抽象基类
- 为不同的属性A构建不同的具体类作为基类的派生类,重写基类的方法。
- 构建属性B的抽象类
- 为不同的属性B构建不同的具体类作为基类的派生类,重写基类的方法。
03 Show me the code
这里利用三种战士使用三种枪械来举例。
#include <iostream>
using namespace std;
// ============================================
// 枪械基类
class Gun_base {
public:
virtual ~Gun_base() {}
virtual void fire() const = 0;
};
// 手枪
class Pistol: public Gun_base {
public:
void fire() const {
cout << "手枪发射—— biu biu biu!" << endl;
}
};
// 步枪
class Rifle: public Gun_base {
public:
void fire() const {
cout << "步枪发射—— tu tu tu!" << endl;
}
};
// 狙击枪
class Awp:public Gun_base {
public:
void fire() const {
cout << "狙击枪发射—— peng!" << endl;
}
};
// ============================================
// ============================================
// 战士基类
class Fighter_base {
public:
virtual ~Fighter_base() {}
virtual void fight(Gun_base* gun) const = 0;
};
// 战士A
class Fighter_A: public Fighter_base {
public:
void fight(Gun_base* gun) const {
cout << "我是战士A! ———— ";
gun->fire();
}
};
// 战士B
class Fighter_B: public Fighter_base {
public:
void fight(Gun_base* gun) const {
cout << "我是战士B! ———— ";
gun->fire();
}
};
// 战士C
class Fighter_C: public Fighter_base {
public:
void fight(Gun_base* gun) const {
cout << "我是战士C! ———— ";
gun->fire();
}
};
// ============================================
int main() {
// 创建三种枪
Gun_base* gun_01 = new Pistol();
Gun_base* gun_02 = new Rifle();
Gun_base* gun_03 = new Awp();
// 创建三种战士
Fighter_base* A = new Fighter_A();
Fighter_base* B = new Fighter_B();
Fighter_base* C = new Fighter_C();
// 不同战士搭配不同枪械展示
C->fight(gun_02);
delete gun_01;
delete gun_02;
delete gun_03;
delete A;
delete B;
delete C;
}