C++桥模式

01 桥模式的用途

若一个类具有两种属性:属性A和属性B。其中A属性有三种B属性有四种。那么实际需要编写的类的个数为3*4 = 12如果我们把具体的类抽象成一种需要装载两种属性的模具,那么需要编写的代码就大大减少。

02 构建方法

以两种属性为例

  1. 构建属性A的抽象基类
  2. 为不同的属性A构建不同的具体类作为基类的派生类,重写基类的方法。
  3. 构建属性B的抽象类
  4. 为不同的属性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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值