桥接模式
1.概述
将抽象部分与实现部分脱耦,使它们都可以独立的变化。 ——《设计模式》GOF
所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。
桥接模式所解决的问题是将两个维度的变化分离开,使它们可以独立的变化,是采用组合的方式使两个维度联系起来。
2.优缺点
优点
1)将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。
2)将可以共享的变化部分,抽离出来,减少了代码的重复信息。
3)对象的具体实现可以更加灵活,可以满足多个因素变化的要求。
缺点
1)客户必须知道选择哪一种类型的实现。
3.与继承的比较
待补充。
4.策略模式、建造者模式、桥接模式的比较
如果不考虑使用场景,单从实现过程来看,桥接模式是策略模式的横向扩展,即维度扩展,如软件维度增加一个手机维度;建造者模式是策略模式的纵向扩展,即增加了一个层次,如软件维度分解成不同的流程,由一个类统一调度。
PS:求喷~
5.策略模式与建造者模式比较代码
待补充。
6.桥接模式与策略模式的比较代码
《大话设计模式C++版》中以手机和软件为例描述了桥接模式。我们先用策略模式来实现一种手机上安装不同软件。
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 6 //手机软件 7 class HandsetSoft 8 { 9 public: 10 virtual void Run()=0; 11 }; 12 13 //游戏软件 14 class HandsetGame : public HandsetSoft 15 { 16 public: 17 virtual void Run() 18 { 19 cout<<"运行手机游戏"<<endl; 20 } 21 }; 22 23 //通讯录软件 24 class HandSetAddressList : public HandsetSoft 25 { 26 public: 27 virtual void Run() 28 { 29 cout<<"手机通讯录"<<endl; 30 } 31 }; 32 33 //手机 34 class Handset 35 { 36 protected: 37 HandsetSoft* m_soft; 38 public: 39 void SetHandsetSoft(HandsetSoft* temp) 40 { 41 m_soft = temp; 42 } 43 virtual void Run() 44 { 45 m_soft->Run(); 46 } 47 }; 48 49 50 //客户端 51 int main() 52 { 53 Handset *brand = new HandSet(); 54 brand->SetHandsetSoft(new HandsetGame()); 55 brand->run(); 56 57 return 0; 58 }
再将手机加上品牌这一维度:
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 6 //手机软件 7 class HandsetSoft 8 { 9 public: 10 virtual void Run()=0; 11 }; 12 13 //游戏软件 14 class HandsetGame : public HandsetSoft 15 { 16 public: 17 virtual void Run() 18 { 19 cout<<"运行手机游戏"<<endl; 20 } 21 }; 22 23 //通讯录软件 24 class HandSetAddressList : public HandsetSoft 25 { 26 public: 27 virtual void Run() 28 { 29 cout<<"手机通讯录"<<endl; 30 } 31 }; 32 33 //手机品牌 34 class HandsetBrand 35 { 36 protected: 37 HandsetSoft* m_soft; 38 public: 39 void SetHandsetSoft(HandsetSoft* temp) 40 { 41 m_soft = temp; 42 } 43 // 策略模式中,软件只需运行于一个平台 44 // 桥接模式中,对软件运行平台这一维度进行扩展, 45 // 使软件运行与不同平台 46 // 使软件和平台这两个维度能独立变化 47 virtual void Run()=0; 48 }; 49 50 //M品牌 51 class HandsetBrandM : public HandsetBrand 52 { 53 public: 54 virtual void Run() 55 { 56 m_soft->Run(); 57 } 58 }; 59 60 //N品牌 61 class HandsetBrandN : public HandsetBrand 62 { 63 public: 64 virtual void Run() 65 { 66 m_soft->Run(); 67 } 68 }; 69 70 //客户端 71 int main() 72 { 73 HandsetBrand *brand = new HandsetBrandM(); 74 brand->SetHandsetSoft(new HandsetGame()); 75 brand->Run(); 76 brand->SetHandsetSoft(new HandSetAddressList()); 77 brand->Run(); 78 79 return 0; 80 }