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