桥接模式

理论

桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。

这里地抽象与它的实现分离,并不是说让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。

可以理解为:实现系统有多个角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

实际就是合成/聚合复用原则的应用。

实例

手机有不同的品牌,又可以包含不同的软件,模拟手机分类

UML类图

按品牌分类实现

 按软件分类实现

上面两种结构在需要增加手机品牌或功能的时候会收到很大的影响,因为通过继承实现的是一种紧耦合关系。如果不断地增加新品牌或新功能,类会越来越多。所以应该遵循合成/聚合复用原则,优先使用对象合成/聚合,而不是类继承

桥接模式地核心意图就是把这些实现独立出来,让它们各自地变化。使得每种实现地变化不会影响其他实现,从而达到应对变化的目的。

 代码实现

#include <iostream>
using namespace std;

//手机软件抽象类
class HandsetSoft {
public:
	virtual void Run() {};
};

//具体软件类
class HandsetGame :public HandsetSoft {
public:
	virtual void Run() {
		cout << "运行手机游戏" << endl;
	}
};
class HandsetAddressList :public HandsetSoft {
public:
	virtual void Run() {
		cout << "运行手机通讯录" << endl;
	}
};

//手机品牌抽象类
class HandsetBrand {
public:
	void SetHandsetSoft(HandsetSoft* soft) {
		this->soft = soft;
	}
	virtual void Run() {};

protected:
	HandsetSoft* soft;
};

//具体手机品牌类
class HandsetBrandN :public HandsetBrand {
public:
	virtual void Run() {
		cout << "品牌N ";
		soft->Run();
	}
};
class HandsetBrandM :public HandsetBrand {
public:
	virtual void Run() {
		cout << "品牌M ";
		soft->Run();
	}
};

//客户端
int main()
{
	HandsetBrand* phone;
	phone = new HandsetBrandN();
	phone->SetHandsetSoft(new HandsetGame);
	phone->Run();
	phone->SetHandsetSoft(new HandsetAddressList);
	phone->Run();

	phone = new HandsetBrandM();
	phone->SetHandsetSoft(new HandsetGame);
	phone->Run();
	phone->SetHandsetSoft(new HandsetAddressList);
	phone->Run();
}

运行结果:

 

posted @ 2022-09-21 12:03  KYZH  阅读(27)  评论(0编辑  收藏  举报