最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++設(shè)計(jì)模式之橋接模式

 更新時(shí)間:2014年09月30日 15:36:49   作者:果凍想  
這篇文章主要介紹了C++設(shè)計(jì)模式之橋接模式,本文講解了什么是橋接模式、為什么要使用橋接模式、什么時(shí)候使用橋接模式等內(nèi)容,需要的朋友可以參考下

問(wèn)題描述

現(xiàn)在要去畫(huà)一個(gè)圖形,圖形有長(zhǎng)方形、圓形和扇形等等;而圖形又可以加上不同的顏色,然后,我們就可以畫(huà)出紅色的長(zhǎng)方形,綠色的長(zhǎng)方形;紅色的圓形,綠色的圓形等等。而這種圖形的形狀在變化,圖形的顏色也在變化,當(dāng)使用代碼去實(shí)現(xiàn)時(shí),如何面對(duì)這種多方面的變化呢?這就要說(shuō)到今天的橋接模式了。

什么是橋接模式?

對(duì)于上述的圖形與顏色的問(wèn)題時(shí),很多時(shí)候,我們讓各個(gè)圖形類繼承顏色類,比如:

復(fù)制代碼 代碼如下:

class CShape
{
};
class CRectangle : public CShape
{
};
class CCircle : public CShape
{
};
class CColor
{
};
class CRed : public CColor
{
};
class CBlue : public CColor
{
};
class CRedRectangle : public CRed
{
};
class CBlueRectangle : public CBlue
{
};

每當(dāng)我們?cè)黾右粋€(gè)新的圖形,或者增加一種新的顏色時(shí),對(duì)應(yīng)的類就會(huì)以相乘的速度進(jìn)行增加。當(dāng)系統(tǒng)中的類變的多時(shí),對(duì)應(yīng)的管理也就變的復(fù)雜,這不是我們希望看到的。同時(shí),我們可以看到CRedRectangle類繼承自CRed類,這種繼承關(guān)系合理嗎?且不說(shuō)有的系統(tǒng)是如此實(shí)現(xiàn)的,紅色的矩形是紅色嗎?很顯然,CRedRectangle和CRed之間不是一種is-a的關(guān)系,所以,上面的實(shí)現(xiàn)是及其不合理的。那么它們是什么關(guān)系呢?接著往下看。

在GOF的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書(shū)中對(duì)橋接模式是這樣說(shuō)的:將抽象部分和它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。簡(jiǎn)單粗暴的說(shuō),就是抽象對(duì)外提供調(diào)用的接口;對(duì)外隱瞞實(shí)現(xiàn)部分,在抽象中引用實(shí)現(xiàn)部分,從而實(shí)現(xiàn)抽象對(duì)實(shí)現(xiàn)部分的調(diào)用,而抽象中引用的實(shí)現(xiàn)部分可以在今后的開(kāi)發(fā)過(guò)程中,切換成別的實(shí)現(xiàn)部分。

為什么要使用橋接模式?

當(dāng)一個(gè)抽象可能有多個(gè)實(shí)現(xiàn)時(shí),通常用繼承來(lái)協(xié)調(diào)它們。抽象類定義對(duì)該抽象的接口,而具體的子類則用不同方式加以實(shí)現(xiàn)。但是此方法有時(shí)不夠靈活。繼承機(jī)制將抽象部分與它的實(shí)現(xiàn)部分固定在一起,使得難以對(duì)抽象部分和實(shí)現(xiàn)部分獨(dú)立的進(jìn)行修改、擴(kuò)充和重用。橋接模式把依賴具體實(shí)現(xiàn),提升為依賴抽象,來(lái)完成對(duì)象和變化因素之間的低耦合,提高系統(tǒng)的可維護(hù)性和擴(kuò)展性。橋接模式的主要目的是將一個(gè)對(duì)象的變化與其它變化隔離開(kāi),讓彼此之間的耦合度最低。

什么時(shí)候使用橋接模式?

1.如果不希望在抽象和它的實(shí)現(xiàn)部分之間有一個(gè)固定的綁定關(guān)系,也就是繼承關(guān)系;如果我們打破了這種固定的綁定關(guān)系,以后,就可以方便的在抽象部分切換不同的實(shí)現(xiàn)部分;

2.如果希望類的抽象以及它的實(shí)現(xiàn)都應(yīng)該可以通過(guò)生成子類的方法加以擴(kuò)充;如果不使用橋接模式,使用繼承去實(shí)現(xiàn)時(shí),在抽象類中添加一個(gè)方法,則在對(duì)應(yīng)的實(shí)現(xiàn)類中也需要做對(duì)應(yīng)的改動(dòng),這種實(shí)現(xiàn)不符合松耦合的要求;

3.如果要求對(duì)一個(gè)抽象的實(shí)現(xiàn)部分的修改對(duì)客戶不產(chǎn)生影響,即客戶的代碼不需要重新編譯,在后面的項(xiàng)目經(jīng)驗(yàn)會(huì)說(shuō)這方面;

4.如果想對(duì)客戶完全隱藏抽象的實(shí)現(xiàn)部分;

5.如果一個(gè)對(duì)象有多個(gè)變化因素的時(shí)候,通過(guò)抽象這些變化因素,將依賴具體實(shí)現(xiàn),修改為依賴抽象;

6.如果某個(gè)變化因素在多個(gè)對(duì)象中共享時(shí),可以抽象出這個(gè)變化因素,然后實(shí)現(xiàn)這些不同的變化因素。

上面使用的場(chǎng)景,是一種建議,也是一種參考。在項(xiàng)目中要很好的把握一個(gè)設(shè)計(jì)模式,是有一定的難度的;當(dāng)在實(shí)際項(xiàng)目中遇到滿足上面的一點(diǎn)或者幾點(diǎn)時(shí),可以考慮使用橋接模式。

UML類圖

Abstraction類定義了抽象類的接口,并且維護(hù)一個(gè)指向Implementor實(shí)現(xiàn)類的指針;

RefineAbstraction類擴(kuò)充了Abstraction類的接口;

Implementor類定義了實(shí)現(xiàn)類的接口,這個(gè)接口不一定要與Abstraction的接口完全一致;實(shí)際上,這兩個(gè)接口可以完全不同;

ConcreteImplementor類實(shí)現(xiàn)了Implementor定義的接口。

代碼實(shí)現(xiàn)

復(fù)制代碼 代碼如下:

/*
** FileName     : BridgePatternDemo
** Author       : Jelly Young
** Date         : 2013/12/4
** Description  : More information, please go to http://m.fzitv.net
*/
#include <iostream>
using namespace std;
class Implementor
{
public:
     virtual void OperationImpl() = 0;
};
class ConcreteImpementor : public Implementor
{
public:
     void OperationImpl()
     {
          cout<<"OperationImpl"<<endl;
     }
};
class Abstraction
{
public:
     Abstraction(Implementor *pImpl) : m_pImpl(pImpl){}
     virtual void Operation() = 0;
protected:
     Implementor *m_pImpl;
};
class RedfinedAbstraction : public Abstraction
{
public:
     RedfinedAbstraction(Implementor *pImpl) : Abstraction(pImpl){}
     void Operation()
     {
          m_pImpl->OperationImpl();
     }
};
int main(int argc, char *argv[])
{
     Implementor *pImplObj = new ConcreteImpementor();
     Abstraction *pAbsObj = new RedfinedAbstraction(pImplObj);
     pAbsObj->Operation();
     delete pImplObj;
     pImplObj = NULL;
     delete pAbsObj;
     pAbsObj = NULL;
     return 0;
}

根據(jù)對(duì)代碼的理解,能想象到CRedRectangle和CRed是什么關(guān)系嗎?我們可以理解為紅色的矩形包含紅色,也就是包含的關(guān)系,也就是軟件設(shè)計(jì)中的組合關(guān)系(has-a)。

項(xiàng)目經(jīng)驗(yàn)

這是一個(gè)我經(jīng)歷的項(xiàng)目,也是做起來(lái)比較輕松的一個(gè)項(xiàng)目。項(xiàng)目是這樣的,需要對(duì)一個(gè)中間的通信庫(kù)進(jìn)行改寫(xiě),保留以前的通信方式的同時(shí),需要使用一種新的通信協(xié)議去和底層模塊進(jìn)行通信?,F(xiàn)有的代碼是一個(gè)COM程序,向外提供了可以調(diào)用的接口。根據(jù)客戶提供的源碼,我們進(jìn)行了分析;在分析之前,我們有一種擔(dān)心,就是怕用戶的代碼是接口和實(shí)現(xiàn)混在一起的;但是,分析之后,讓我們很吃驚,客戶的代碼結(jié)構(gòu)很清晰,層次非常清楚,代碼中使用的就是我們今天這里說(shuō)的橋接模式。由于抽象的接口和實(shí)現(xiàn)完全進(jìn)行了分離,我們?cè)谶M(jìn)行重寫(xiě)時(shí),只需要實(shí)現(xiàn)我們的一個(gè)類,然后在接口中引用我們實(shí)現(xiàn)的類,就大功告成了,這樣做到了客戶端不需要做任何修改,就可以完美的替換掉原來(lái)的通信層,真的是前人栽樹(shù)樹(shù),后人乘涼啊。

總結(jié)

橋接模式使得抽象和實(shí)現(xiàn)進(jìn)行了分離,抽象不用依賴于實(shí)現(xiàn),讓抽象和實(shí)現(xiàn)部分各自修改起來(lái)都很方便,使用組合(就是Abstraction類中包含了Implementor)的方式,降低了耦合度,同時(shí)也有助于分層,從而產(chǎn)生更好的結(jié)構(gòu)化系統(tǒng)。通過(guò)實(shí)際的項(xiàng)目經(jīng)驗(yàn),使用了橋接模式的代碼,對(duì)以后的擴(kuò)展有很大的幫助。

相關(guān)文章

  • C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例

    C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • C語(yǔ)言在輸入輸出時(shí)遇到的常見(jiàn)問(wèn)題總結(jié)

    C語(yǔ)言在輸入輸出時(shí)遇到的常見(jiàn)問(wèn)題總結(jié)

    大家在平時(shí)的做題中是否會(huì)遇到和我一樣的煩惱,題目的代碼已經(jīng)基本完成,但是在輸出時(shí)候,總是和題目給出的樣例輸出格式不同?,導(dǎo)致題目不能通過(guò)。為了解決這一煩惱,我總結(jié)了以下幾點(diǎn),需要的可以參考一下
    2022-09-09
  • C++利用 _findfirst與_findnext查找文件的方法

    C++利用 _findfirst與_findnext查找文件的方法

    這篇文章主要給大家介紹了關(guān)于C++利用 _findfirst與_findnext查找文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • C++面試八股文之了解auto關(guān)鍵字

    C++面試八股文之了解auto關(guān)鍵字

    這篇文章主要為大家介紹了C++面試八股文之了解auto關(guān)鍵字問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • C++?Boost?StringAlgorithms超詳細(xì)講解

    C++?Boost?StringAlgorithms超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • 單線程會(huì)導(dǎo)致死鎖你知道嗎

    單線程會(huì)導(dǎo)致死鎖你知道嗎

    這篇文章主要為大家詳細(xì)介紹了單線程會(huì)不會(huì)導(dǎo)致死鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++ ofstream與ifstream詳細(xì)用法

    C++ ofstream與ifstream詳細(xì)用法

    ofstream是從內(nèi)存到硬盤,ifstream是從硬盤到內(nèi)存,其實(shí)所謂的流緩沖就是內(nèi)存空間
    2013-07-07
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之迷宮求解問(wèn)題

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之迷宮求解問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之迷宮求解問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 一盤王者的時(shí)間用C語(yǔ)言實(shí)現(xiàn)三子棋

    一盤王者的時(shí)間用C語(yǔ)言實(shí)現(xiàn)三子棋

    相信我們都玩過(guò)三子棋,規(guī)則很簡(jiǎn)單,但想用c語(yǔ)言做出這個(gè)游戲,事實(shí)上也是比較簡(jiǎn)單的,下面通過(guò)c語(yǔ)言進(jìn)行對(duì)五子棋的分析
    2022-02-02
  • C++ 刪除字符串的2種方法小結(jié)

    C++ 刪除字符串的2種方法小結(jié)

    這篇文章主要介紹了C++ 刪除字符串的2種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論

上高县| 枝江市| 延庆县| 墨江| 洛浦县| 阿勒泰市| 五家渠市| 新兴县| 门头沟区| 乐山市| 南郑县| 平遥县| 鄂伦春自治旗| 承德市| 抚宁县| 介休市| 安新县| 台北市| 库尔勒市| 黄浦区| 环江| 博野县| 天峨县| 江安县| 新余市| 漠河县| 陇川县| 东阳市| 通化县| 民勤县| 石门县| 廊坊市| 资兴市| 镇坪县| 广饶县| 北辰区| 怀化市| 乐都县| 松原市| 钦州市| 邢台县|