設計模式之橋接模式(Bridge)


一、初識橋接模式

對於電腦大家是在熟悉不過,看看大家的電腦,有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):將抽象部分與實現部分分離,使它們都可以獨立的變化。什么叫抽象部分和實現部分分離?我們分析一下上面兩種結構圖,可以發現一個是用繼承完成的,一種是用組合/聚合的方式完成的,而采用組合/聚合的方式就是所謂的抽象與實現分離。實際上在設計類時,我們應該首先考慮的是組合/聚合的方式,而不是考慮繼承的方式,因為繼承是一種強耦合關系,使用繼承使得子類過多的依靠父類,這並不是很好。

二、橋接模式的代碼實現

說了這么多,還是要親自的實現以下橋接模式。不妨就實現這個電腦分類的例子吧:

View Code
 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 }

 

運行結果:

小結:那么什么時候使用橋接模式呢?當系統可以從多個角度分類,每一種分類都有可能變化,那么就把這種多角度分類分離出來讓他們獨立變化,這樣就可以減少他們之間的耦合。實際上使用橋接模式的好處已經不用多說了,在代碼中和上面給出兩種結構圖中已經足夠看出來了。那么想一想橋接模式和裝飾模式有什么區別呢??橋接模式是適應多個維度變化的一種模式。而裝飾模式是適應新需求的不斷增加的一種模式。注意體會這兩種模式的實現方式~~~

 


學習中的一點總結,歡迎拍磚哦^^


 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM