一、初識橋接模式
對於電腦大家是在熟悉不過,看看大家的電腦,有dell的,有lenovo的。比如我的電腦室dell的,但是第一次裝系統的時候用的是xp的系統,后來出 win7 了,於是我興高采烈的裝了一個win7旗艦版。關於電腦的分類的結構圖大概是這樣的。
我們知道,電腦品牌多了去了,比如Acer,HP等等,系統也不只是XP和Win7,還有Linux和Unix等等啊,這樣一來電腦的具體分類就多了去了。顯然采用上面的結構圖描述是不合理的了。我們看看還有木有其他的結構圖,比如我們也可以這樣的描述電腦的分類:
先來分析一下上面的結構,將系統分為:XP系統和Win7系統,同時電腦按品牌分類可以分為Dell和Lenovo,然后電腦品牌和系統自由組合,這樣就可以組合出XP系統的Dell、Win7系統的Dell、XP系統的Lenovo和Win7系統的Lenovo了。如果采用了上面的結構,現在要增加電腦品牌Acer和操作系統Linux只需要讓Acer繼承電腦,Linux繼承系統,然后還是自由組合就行了。
實際上第二種結構就是采用的橋接模式畫出的結構圖了,GoF說:橋接模式(Bridge):將抽象部分與實現部分分離,使它們都可以獨立的變化。什么叫抽象部分和實現部分分離?我們分析一下上面兩種結構圖,可以發現一個是用繼承完成的,一種是用組合/聚合的方式完成的,而采用組合/聚合的方式就是所謂的抽象與實現分離。實際上在設計類時,我們應該首先考慮的是組合/聚合的方式,而不是考慮繼承的方式,因為繼承是一種強耦合關系,使用繼承使得子類過多的依靠父類,這並不是很好。
二、橋接模式的代碼實現
說了這么多,還是要親自的實現以下橋接模式。不妨就實現這個電腦分類的例子吧:

1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 7 class OS 8 { 9 private: 10 string name; 11 public: 12 OS(string n):name(n){}; 13 void set_name(string n) 14 { 15 this->name = n; 16 } 17 string get_name() 18 { 19 return this->name; 20 } 21 }; 22 //XP操作系統 23 class XP : public OS 24 { 25 public: 26 XP(string n = "XP"):OS(n){}; 27 }; 28 //Win7操作系統 29 class Win7 : public OS 30 { 31 public: 32 Win7(string n = "Win7"):OS(n){}; 33 }; 34 //Linux操作系統 35 class Linux : public OS 36 { 37 public: 38 Linux(string n = "Linux"):OS(n){}; 39 }; 40 //抽象電腦品牌 41 class Computer 42 { 43 private: 44 string brand; 45 OS os; 46 public: 47 Computer(OS xt,string b):brand(b),os(xt){}; 48 void set_os(OS os) 49 { 50 this->os = os; 51 } 52 OS get_os() 53 { 54 return this->os; 55 } 56 void init() 57 { 58 cout<<brand<<"電腦正在運行"<<os.get_name()<<endl; 59 } 60 }; 61 //Dell電腦 62 class Dell : public Computer 63 { 64 public: 65 Dell(OS os,string b = "Dell"):Computer(os,b){}; 66 }; 67 //Lenovo電腦 68 class Lenovo : public Computer 69 { 70 public: 71 Lenovo(OS os,string b = "Lenovo"):Computer(os,b){}; 72 }; 73 int main() 74 { 75 //實例化三個操作系統 76 XP xp; 77 Win7 win7; 78 Linux linux; 79 //建立兩種品牌的電腦 80 Dell dell(xp); 81 Lenovo lenovo(win7); 82 dell.init(); 83 lenovo.init(); 84 //我的dell重裝linux 85 dell.set_os(linux); 86 dell.init(); 87 return 0; 88 }
運行結果:
小結:那么什么時候使用橋接模式呢?當系統可以從多個角度分類,每一種分類都有可能變化,那么就把這種多角度分類分離出來讓他們獨立變化,這樣就可以減少他們之間的耦合。實際上使用橋接模式的好處已經不用多說了,在代碼中和上面給出兩種結構圖中已經足夠看出來了。那么想一想橋接模式和裝飾模式有什么區別呢??橋接模式是適應多個維度變化的一種模式。而裝飾模式是適應新需求的不斷增加的一種模式。注意體會這兩種模式的實現方式~~~
學習中的一點總結,歡迎拍磚哦^^