桥接模式
理论
桥接模式(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();
}
运行结果:


浙公网安备 33010602011771号