设计模式4——桥接模式

当物体有几种不同的属性时,这时类的继承就会变的多样。

例如,一款手机按类型可分为功能机和智能机,按颜色可分为黑色、白色、红色等,按品牌可分为苹果、三星、小米等。

当属性越多,则需要创建的类就更多,使用桥接模式能够大大降低问题的复杂性,并且能够极大程度降低耦合。

示例代码:

Bridge.h内容

 1 #ifndef Bridge_H_H
 2 #define Bridge_H_H
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 class Color
 8 {
 9 public:
10     Color() {}
11     virtual ~Color() {}
12     virtual void display() = 0;
13 };
14 
15 class ColorWhite : public Color
16 {
17 public:
18     virtual void display() { cout << "Color is White!" << endl; }
19 };
20 
21 class ColorBlack : public Color
22 {
23 public:
24     virtual void display() { cout << "Color is Black!" << endl; };
25 };
26 
27 class Phone
28 {
29 public:
30     Phone() : color(NULL) {}
31     virtual ~Phone() {}
32     virtual void display() { color->display(); }
33     void setColor(Color *color0){
34         color = color0;
35     }
36 private:
37     Color *color;
38 };
39 
40 class FunctionalPhone : public Phone
41 {
42 public:
43     virtual void display(){
44         cout << "Type is Functional! ";
45         Phone::display();
46     }
47 };
48 
49 class IntelligentPhone : public Phone
50 {
51 public:
52     virtual void display(){
53         cout << "Type is Intelligient! ";
54         Phone::display();
55     }
56 };
57 
58 void BridgeTest()
59 {
60     Color *color1 = new ColorWhite();
61     Color *color2 = new ColorBlack();
62 
63     Phone *phone1 = new FunctionalPhone();
64     Phone *phone2 = new IntelligentPhone();
65 
66     phone1->setColor(color1);
67     phone1->display();
68     phone1->setColor(color2);
69     phone1->display();
70 
71     phone2->setColor(color1);
72     phone2->display();
73     phone2->setColor(color2);
74     phone2->display();
75 }
76 
77 #endif

运行结果:

所设计的颜色和类型分别只有两个,优势体现不明显,当每种类型继承较多时,优势将会很明显。

假如类型和颜色分别有5种和7种,则5+7比5*7要小很多,结构也会更加清晰。

原文地址:https://www.cnblogs.com/MiniHouse/p/3974689.html