桥接模式

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 }

 

原文地址:https://www.cnblogs.com/SnailProgramer/p/4263765.html