青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

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

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

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

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

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

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

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

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

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

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

* 根據以上的需求,我們的代碼設計如下(這里先不使用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//不使用橋模式代碼  

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

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

class CShape1  

{  

public:  

    virtual void Draw() = 0;  

protected:  

    CDrawLib1 _drawLib;  

};  

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

class CCircle1: public CShape1  

{  

public:  

    // 實現Draw操作,使用畫圖庫1  

    virtual void Draw()  

    {  

        // 使用畫圖庫1  

        _drawLib.DrawCircle();    

    }  

};  

class CRectangle1: public CShape1  

{   

public:  

    // 實現Draw操作,但是要使用畫圖庫1  

    virtual void Draw()  

    {  

        // 使用畫圖庫1  

        _drawLib.DrawRectangle();     

    }  

};  

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

class CShape2  

{  

public:  

    virtual void Draw() = 0;  

protected:  

    CDrawLib2 _drawLib;  

};  

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

class CCircle2: public CShape2  

{  

public:  

    // 實現Draw操作,使用畫圖庫2  

    virtual void Draw()  

    {  

        // 使用畫圖庫2  

        _drawLib.DrawCircle();    

    }  

};  

class CRectangle2: public CShape2  

{  

public:  

    // 實現Draw操作,但是要使用畫圖庫2  

    virtual void Draw()  

    {  

        // 使用畫圖庫2  

        _drawLib.DrawRectangle();     

    }  

};  

void Draw1(CShape1 &s)  

{  

    s.Draw();  

}  

void Draw2(CShape2 &s)  

{  

    s.Draw();  

}  

// 好了,我們開始使用上面的類來實現我們的畫圖系統  

void main()  

{  

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

      

    // 我可以使用兩種庫  

    CCircle1 c1;  

    CCircle2 c2;  

    CRectangle1 r1;  

    CRectangle2 r2;  

    Draw1(c1);  

    Draw1(r1);  

    Draw2(c2);  

    Draw2(r2);  

}  

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

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

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

* 出現變化的地方可能是這樣的: 

* 1、出現了第三個庫 

* 2、畫圖系統需要畫三角形 

* 這個時候,我們再看看要完成這兩個變化我們需要作的修改,就會發現,我要暈了 

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

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

#else  

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

* 好了,現在讓我們使用Bridge模式來實現上面的系統 

* Bridge模式最重要是把表示和實現分開 

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

// 建立一個實現操作的類: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();  

    }  

};  

// 好了,我們利用上面的類結構來實現我們的畫圖系統  

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、出現了第三個庫 

* 2、畫圖系統需要畫三角形 

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

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

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

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

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

posted on 2011-09-27 18:42 Yu_ 閱讀(372) 評論(0)  編輯 收藏 引用 所屬分類: GoF23

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美大片一区二区| 麻豆精品精品国产自在97香蕉| 国产精品av久久久久久麻豆网| 欧美激情第六页| 欧美国产日韩一区二区在线观看 | 伊人久久大香线蕉av超碰演员| 国产精品网站视频| 激情综合网址| 亚洲福利免费| 国产精品99久久久久久久久 | 亚洲黄色有码视频| 一本色道久久精品| 欧美一区二区免费观在线| 久久精品观看| 91久久黄色| 99re热精品| 香港久久久电影| 久久噜噜亚洲综合| 欧美日韩在线免费视频| 国产一区视频网站| 亚洲美女av在线播放| 欧美一区二区三区电影在线观看| 美乳少妇欧美精品| 在线视频一区二区| 老司机免费视频久久| 欧美日韩免费一区二区三区| 国产一区二区三区日韩欧美| 亚洲免费成人| 久久亚洲精品中文字幕冲田杏梨| 亚洲乱码国产乱码精品精天堂| 欧美中文字幕视频在线观看| 欧美日韩久久不卡| 国产精品一区二区久久| 在线观看国产成人av片| 午夜精品久久久久久久男人的天堂| 久久最新视频| 亚洲欧美国产精品va在线观看| 欧美精品久久久久久久免费观看 | 欧美专区在线观看| 韩国久久久久| 亚洲欧洲99久久| 亚洲欧洲精品一区二区精品久久久| 西西人体一区二区| 亚洲精品免费一区二区三区| 99视频一区二区三区| 国产一区二区三区四区老人| 在线观看欧美黄色| 久久久久久久一区| 亚洲一区二区精品在线| 欧美日本一区二区视频在线观看| 在线国产精品一区| 久久伊人一区二区| 欧美在线资源| 国产专区一区| 久久久蜜桃精品| 羞羞色国产精品| 一区二区三区鲁丝不卡| 欧美日韩成人激情| 亚洲视频图片小说| 日韩视频免费观看| 欧美另类69精品久久久久9999| 亚洲激情在线播放| 欧美电影免费观看| 美女脱光内衣内裤视频久久影院| 1204国产成人精品视频| 欧美成人福利视频| 免费国产一区二区| 亚洲精品一区二区三区四区高清 | 亚洲一区国产精品| 一区二区国产日产| 国产精品视频精品| 久久久久成人精品| 久久中文字幕导航| 日韩一级大片在线| 中文在线资源观看网站视频免费不卡 | 在线一区欧美| 国产精品久久久久一区二区三区| 亚洲自拍偷拍色片视频| 亚洲在线视频观看| 国产真实乱偷精品视频免| 久久在线视频在线| 欧美高清在线| 午夜在线播放视频欧美| 欧美在线亚洲一区| 亚洲日韩欧美视频一区| 一本色道久久88亚洲综合88| 亚洲伊人一本大道中文字幕| 欧美色精品天天在线观看视频 | 欧美福利一区| 欧美日韩在线视频一区| 久久国产天堂福利天堂| 欧美阿v一级看视频| 亚洲午夜精品国产| 欧美在线影院| 亚洲一区中文| 久久亚洲影院| 亚洲自拍高清| 欧美高清视频在线观看| 久久xxxx精品视频| 欧美日产国产成人免费图片| 久久成人国产精品| 欧美精品在线视频| 久久只精品国产| 国产精品sss| 欧美激情中文字幕乱码免费| 国产精品视频免费观看| 亚洲国产精品成人精品| 国产美女诱惑一区二区| 亚洲精品三级| 亚洲国产精品成人精品| 久久青草欧美一区二区三区| 欧美日韩成人| 欧美激情一区二区三区在线视频观看| 国产精品播放| 亚洲国产成人不卡| 韩国成人福利片在线播放| 一区二区不卡在线视频 午夜欧美不卡'| 国产一区二区福利| 一本大道久久精品懂色aⅴ| 亚洲黄色免费| 久久综合免费视频影院| 久久久久久久国产| 国产精品色午夜在线观看| 日韩一级在线观看| 99热在线精品观看| 欧美a级片网| 欧美风情在线观看| 在线国产精品一区| 免费成年人欧美视频| 久久人人爽人人爽爽久久| 国产乱码精品1区2区3区| 亚洲手机在线| 午夜精品久久久久99热蜜桃导演| 欧美日韩高清在线| 亚洲精品之草原avav久久| 亚洲精品免费在线| 六月丁香综合| 你懂的网址国产 欧美| 亚洲大片在线| 欧美大尺度在线观看| 亚洲国产清纯| 一本一本大道香蕉久在线精品| 欧美成人激情视频| 亚洲国产精品久久久久久女王| 亚洲高清不卡一区| 欧美福利一区| 亚洲精品一区二区在线观看| 中文国产成人精品| 国产精品成人一区二区| 亚洲一区二区在| 久久久国产精彩视频美女艺术照福利| 国产性天天综合网| 久久久噜噜噜久久人人看| 在线精品福利| 另类春色校园亚洲| 91久久久在线| 亚洲女人av| 激情综合久久| 欧美粗暴jizz性欧美20| 在线视频亚洲欧美| 久久aⅴ国产欧美74aaa| 亚洲高清自拍| 欧美日韩少妇| 欧美中文字幕不卡| 亚洲人午夜精品| 欧美在线免费观看| 91久久黄色| 久久久久久婷| 国产精品99久久不卡二区| 国产精品99久久久久久宅男| 亚洲乱码国产乱码精品精天堂 | 巨乳诱惑日韩免费av| 亚洲日韩成人| 国产麻豆综合| 欧美精品激情blacked18| 亚洲欧美视频一区二区三区| 欧美国产日韩精品| 午夜在线视频一区二区区别| 依依成人综合视频| 国产精品成人在线| 久久综合亚洲社区| 午夜精品美女久久久久av福利| 欧美福利视频网站| 久久福利精品| 亚洲一区二区精品视频| 亚洲高清久久网| 国产乱码精品一区二区三区不卡 | 久久久久久夜精品精品免费| 99伊人成综合| 在线观看成人一级片| 国产色综合久久| 欧美日韩裸体免费视频| 久久免费少妇高潮久久精品99| 亚洲桃色在线一区| 亚洲精品美女在线观看播放| 久久综合99re88久久爱| 欧美一级黄色网| 亚洲天堂偷拍| 亚洲午夜一区二区| 一区二区三区.www|