• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 34,comments - 2,trackbacks - 0
            1、什么是Bridge模式?
            這個問題我用一言兩語實在無法概括其根本。不過我是這樣分析的:
            ①、對象這個概念可以認為是由“屬性”和“行為”兩個部分組成的。屬性我們可以認為是一種靜止的,是一種抽象;一般情況下,行為是包含在一個對象中,但是,在有的情況下,我們需要將這些行為也進行歸類,形成一個總的行為接口,這就是橋模式的用處。
            ②、Bridge模式是解決多層繼承的。如果你在實現(xiàn)應用中一個類,需要繼承兩個以上的類,并且這兩者之間又持有某種關系,它們兩個都會有多種變化。Bridge模式是把這兩個類,分解為一個抽象一個實現(xiàn),使它們兩個分離,這樣兩種類可以獨立的變化。舉一個例子:

            例如, 比如汽車類(Car),假設有2個子類,卡車類(Truck)與公交車類(Bus),它們有[設置引擎]這個動作行為,通過不同引擎規(guī)格的設置,可以將它們設置為比如為1500cc(Car1500),和2000cc(Car2000)的車。

            這樣一來,我們怎么來設計汽車類呢?
            方法一:通過繼承設計所有可能存在的子類。可能我們會想到下面的這種繼承關系:
            汽車總類:Car
            汽車子類 - 按種類分類:Bus,Truck
            汽車子類 - 按引擎分類:Bus1500,Bus2000,Truck1500,Truck2000
            這樣設置引擎這個動作就由各個子類加以實現(xiàn)。

            但如果以后需要增加一種救火車(FireCar),以及增加一個引擎規(guī)格2500cc,需要實現(xiàn)的子類將會有:
            Bus1500,Bus2000,Bus2500,Truck1500,Truck2000,Truck2500,F(xiàn)ireCar1500,F(xiàn)ireCar2000,F(xiàn)ireCar2500
            多達9個。
            也就是說,這種設計方法,子類數(shù)目將隨幾何級數(shù)增長。
            而且,Bus1500,Truck1500的引擎規(guī)格相同,它們的引擎設置動作應該是一樣的,但現(xiàn)在把它們分成不同的子類,難以避免執(zhí)行重復的動作行為。

            方法二:分別為Bus以及Truck實現(xiàn)設置不同引擎的方法
            汽車總類:Car
            汽車子類:Bus,Truck
            然后在Bus類里分別提供1500cc以及2000cc引擎的設置方法:
            Bus extends Car {
                public setEngine1500cc();
                public setEngine2000cc();
            }
            在Truck類里也分別提供1500cc以及2000cc引擎的設置方法:
            Truck extends Car {
                public setEngine1500cc();
                public setEngine2000cc();
            }
            //這樣沒增加一種規(guī)格都要在每種車里修改子類內(nèi)容。增加引擎設置方法,這種牽一發(fā)而動全身的做法也非常復雜。
            方法三:橋梁模式。
            抽象 - Abstraction類:汽車類及其子類:
            Car:汽車總類
            Truck:汽車子類 - 卡車類。
            Bus:汽車子類 - 公交車類。

            行為實現(xiàn) - Implementor:汽車引擎設置的行為類及子類
            SetCarEngine:汽車引擎的設置接口
            SetCarEngine1500cc:設置1500cc引擎
            SetCarEngine2000cc:設置2000cc引擎
            小結(jié):橋模式就是將抽象和行為劃分開來,各自獨立,但能動態(tài)的結(jié)合。將抽象化與實現(xiàn)化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關聯(lián)變成弱關聯(lián),也就是指在一個軟件系統(tǒng)的抽象化和實現(xiàn)化之間使用組合/聚合關系而不是繼承關系,從而使兩者可以獨立的變化。

            2、使用Bridge模式
            現(xiàn)在需要設計兩個接口:抽象接口和行為接口,分別放置抽象和行為.

            那我們從分離抽象和行為的角度,使用Bridge模式來實現(xiàn)。
            從網(wǎng)上抄來的很直觀的方法。
            * 任務敘述:我們現(xiàn)在要實現(xiàn)一個畫圖系統(tǒng),這個系統(tǒng)的需求暫時來說有以下幾個: 

            * 1、畫圓、畫長方形。(先實現(xiàn)畫這兩個形狀)  

            * 2、已經(jīng)有兩個畫圖庫了,這些畫圖庫中定義了我們需要的操作,我們沒必要重新去實現(xiàn)了 

            * 3、我們的系統(tǒng)能夠決定使用哪個的畫圖庫中的操作 

            * 根據(jù)以上的需求,我們的代碼設計如下(這里先不使用Bridge模式,以便對比) : 

            #include <stdio.h>  

            #include <iostream>  

            using namespace std;  

            // 把這里注釋掉就是不使用Bridge模式的代碼  

            #define _BRIDGE_MODE  

            // 畫圖庫1  

            class CDrawLib1  

            {  

            public:  

                void DrawCircle()  

                {  

                    cout << "畫圓操作1" << endl;  

                }  

                void DrawRectangle()  

                {  

                    cout << "畫長方形操作1" << endl;  

                }  

                void DrawTriangle()  

                {  

                    cout << "畫三角形操作1" << endl;  

                }  

            };  

            // 畫圖庫2  

            class CDrawLib2  

            {  

            public:  

                void DrawCircle()  

                {  

                    cout << "畫圓操作2" << endl;  

                }  

                 

                void DrawRectangle()  

                {  

                    cout << "畫長方形操作2" << endl;  

                }  

                void DrawTriangle()  

                {  

                    cout << "畫三角形操作2" << endl;  

                }         

            };   

            //  只要聲明 _BRIDGE_MODE 就可以在使用或者不使用Bridge模式間切換了  

            #ifndef _BRIDGE_MODE//不使用橋模式代碼  

            // 看到形狀,很容易想到經(jīng)典的Shape抽象類,并定義一個Draw接口  

            // 這里1代表使用畫圖庫1的畫圖操作  

            class CShape1  

            {  

            public:  

                virtual void Draw() = 0;  

            protected:  

                CDrawLib1 _drawLib;  

            };  

            // 畫圓和畫長方形,好,這里就派生出兩個形狀  

            class CCircle1: public CShape1  

            {  

            public:  

                // 實現(xiàn)Draw操作,使用畫圖庫1  

                virtual void Draw()  

                {  

                    // 使用畫圖庫1  

                    _drawLib.DrawCircle();    

                }  

            };  

            class CRectangle1: public CShape1  

            {   

            public:  

                // 實現(xiàn)Draw操作,但是要使用畫圖庫1  

                virtual void Draw()  

                {  

                    // 使用畫圖庫1  

                    _drawLib.DrawRectangle();     

                }  

            };  

            // 再定義使用畫圖庫2Shape  

            class CShape2  

            {  

            public:  

                virtual void Draw() = 0;  

            protected:  

                CDrawLib2 _drawLib;  

            };  

            // 畫圓和畫長方形,好,這里就派生出兩個形狀  

            class CCircle2: public CShape2  

            {  

            public:  

                // 實現(xiàn)Draw操作,使用畫圖庫2  

                virtual void Draw()  

                {  

                    // 使用畫圖庫2  

                    _drawLib.DrawCircle();    

                }  

            };  

            class CRectangle2: public CShape2  

            {  

            public:  

                // 實現(xiàn)Draw操作,但是要使用畫圖庫2  

                virtual void Draw()  

                {  

                    // 使用畫圖庫2  

                    _drawLib.DrawRectangle();     

                }  

            };  

            void Draw1(CShape1 &s)  

            {  

                s.Draw();  

            }  

            void Draw2(CShape2 &s)  

            {  

                s.Draw();  

            }  

            // 好了,我們開始使用上面的類來實現(xiàn)我們的畫圖系統(tǒng)  

            void main()  

            {  

                cout << "不使用Bridge模式" << endl;  

                  

                // 我可以使用兩種庫  

                CCircle1 c1;  

                CCircle2 c2;  

                CRectangle1 r1;  

                CRectangle2 r2;  

                Draw1(c1);  

                Draw1(r1);  

                Draw2(c2);  

                Draw2(r2);  

            }  

            /************************************************************************************************************\ 

            * 好的,上述的代碼運行正常,如果不需要維護的話,我們就不用管它拉~~ 

            * 但是,代碼是一定要維護的,逃不過的宿命。 

            * 出現(xiàn)變化的地方可能是這樣的: 

            * 1、出現(xiàn)了第三個庫 

            * 2、畫圖系統(tǒng)需要畫三角形 

            * 這個時候,我們再看看要完成這兩個變化我們需要作的修改,就會發(fā)現(xiàn),我要暈了 

            * (當一個程序員要暈的時候,也就是BUG要出現(xiàn)的時候了) 

            \************************************************************************************************************/ 

            #else  

            /************************************************************************************************************\ 

            * 好了,現(xiàn)在讓我們使用Bridge模式來實現(xiàn)上面的系統(tǒng) 

            * Bridge模式最重要是把表示和實現(xiàn)分開 

            \************************************************************************************************************/ 

            // 建立一個實現(xiàn)操作的類:CShapeImp  

            class CShapeImp  

            {  

            public:  

                virtual void DrawCircle() = 0;  

                virtual void DrawRectangle() = 0;  

            };  

            class CShapeImp1: public CShapeImp  

            {  

            public:  

                virtual void DrawCircle()  

                {  

                    _dLib.DrawCircle();  

                }  

                virtual void DrawRectangle()  

                {  

                    _dLib.DrawRectangle();  

                }  

            private:  

                CDrawLib1 _dLib;  

            };  

            class CShapeImp2: public CShapeImp  

            {  

            public:  

                virtual void DrawCircle()  

                {  

                    _dLib.DrawCircle();  

                }  

                virtual void DrawRectangle()  

                {  

                    _dLib.DrawRectangle();  

                }  

            private:  

                CDrawLib2 _dLib;      

            };  

            class CShape  

            {  

            public:  

                virtual void Draw() = 0;  

            protected:  

                CShapeImp *_sImp;  

            };  

            class CCircle: public CShape  

            {  

            public:  

                CCircle(CShapeImp *imp)  

                {  

                    _sImp = imp;  

                }  

                virtual void Draw()  

                {  

                    _sImp->DrawCircle();  

                }     

            };  

            class CRectangle: public CShape  

            {   

            public:  

                CRectangle(CShapeImp *imp)  

                {  

                    _sImp = imp;  

                }     

                virtual void Draw()  

                {  

                    _sImp->DrawRectangle();  

                }  

            };  

            // 好了,我們利用上面的類結(jié)構(gòu)來實現(xiàn)我們的畫圖系統(tǒng)  

            void main()  

            {  

                cout << "使用Bridge模式" << endl;  

                CShapeImp1 sImp1;  

                CShapeImp2 sImp2;  

                  

                // 使用畫圖庫1  

                CCircle c1(&sImp1);  

                CRectangle r1(&sImp1);  

                c1.Draw();  

                r1.Draw();  

                  

                // 使用畫圖庫2  

                CCircle c2(&sImp2);  

                CRectangle r2(&sImp2);  

                c2.Draw();  

                r2.Draw();  

            }  

            /************************************************************************************************************\ 

            * 好的,上述的代碼運行正常,并且維護也方便了,回想一下上面的兩個新需求: 

            * 1、出現(xiàn)了第三個庫 

            * 2、畫圖系統(tǒng)需要畫三角形 

            * 考慮一下,對于第一個需求,我們只需要再增加一個ShapeImp就可以了。 

            * 再看第二個需求,我們也是只需要派生一個CTriangle就可以了 

            * 可以看出來,變化不再造成混亂,只需要單獨針對變化改動代碼就行了。 

            * 也就是,變化被Bridge給分開了。 

            \***********************************************************************

            posted on 2011-09-27 18:42 Yu_ 閱讀(341) 評論(0)  編輯 收藏 引用 所屬分類: GoF23
            狠狠久久综合| 亚洲∧v久久久无码精品| 国产精品成人99久久久久| 久久久久久久亚洲精品| 欧美亚洲日本久久精品| 精品永久久福利一区二区| 国产成人无码精品久久久免费| 久久久噜噜噜久久中文字幕色伊伊| 色婷婷综合久久久久中文字幕 | 欧美午夜精品久久久久免费视| 77777亚洲午夜久久多喷| 久久久久久A亚洲欧洲AV冫| 久久精品aⅴ无码中文字字幕不卡| 久久精品国产久精国产思思| 精品久久久久中文字幕一区| 熟妇人妻久久中文字幕| 久久本道久久综合伊人| 精品国产乱码久久久久久1区2区| 三级韩国一区久久二区综合| 国内精品久久久久影院免费| 日韩美女18网站久久精品| 国产精品久久波多野结衣| 久久亚洲AV无码精品色午夜麻豆| 久久精品国产99国产电影网| 亚洲狠狠婷婷综合久久蜜芽| 亚洲国产小视频精品久久久三级| 久久国产精品99久久久久久老狼| 久久99热这里只频精品6| 欧美久久天天综合香蕉伊| 精品久久久久久99人妻| 久久精品国产99国产精偷 | 91精品国产高清91久久久久久 | 大伊人青草狠狠久久| 一本色综合网久久| 久久久国产精华液| 亚洲精品乱码久久久久久蜜桃不卡| 一个色综合久久| 一本色道久久88—综合亚洲精品| 日本久久久久久久久久| 久久人与动人物a级毛片| 久久WWW免费人成一看片|