设计模式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要小很多,结构也会更加清晰。