亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設計模式之橋接模式

2020-05-23 14:21:22
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式之橋接模式,本文講解了什么是橋接模式、為什么要使用橋接模式、什么時候使用橋接模式等內容,需要的朋友可以參考下
 
 

問題描述

現在要去畫一個圖形,圖形有長方形、圓形和扇形等等;而圖形又可以加上不同的顏色,然后,我們就可以畫出紅色的長方形,綠色的長方形;紅色的圓形,綠色的圓形等等。而這種圖形的形狀在變化,圖形的顏色也在變化,當使用代碼去實現時,如何面對這種多方面的變化呢?這就要說到今天的橋接模式了。

什么是橋接模式?

對于上述的圖形與顏色的問題時,很多時候,我們讓各個圖形類繼承顏色類,比如:

復制代碼代碼如下:

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
{
};

 

每當我們增加一個新的圖形,或者增加一種新的顏色時,對應的類就會以相乘的速度進行增加。當系統中的類變的多時,對應的管理也就變的復雜,這不是我們希望看到的。同時,我們可以看到CRedRectangle類繼承自CRed類,這種繼承關系合理嗎?且不說有的系統是如此實現的,紅色的矩形是紅色嗎?很顯然,CRedRectangle和CRed之間不是一種is-a的關系,所以,上面的實現是及其不合理的。那么它們是什么關系呢?接著往下看。

在GOF的《設計模式:可復用面向對象軟件的基礎》一書中對橋接模式是這樣說的:將抽象部分和它的實現部分分離,使它們都可以獨立的變化。簡單粗暴的說,就是抽象對外提供調用的接口;對外隱瞞實現部分,在抽象中引用實現部分,從而實現抽象對實現部分的調用,而抽象中引用的實現部分可以在今后的開發過程中,切換成別的實現部分。

為什么要使用橋接模式?

當一個抽象可能有多個實現時,通常用繼承來協調它們。抽象類定義對該抽象的接口,而具體的子類則用不同方式加以實現。但是此方法有時不夠靈活。繼承機制將抽象部分與它的實現部分固定在一起,使得難以對抽象部分和實現部分獨立的進行修改、擴充和重用。橋接模式把依賴具體實現,提升為依賴抽象,來完成對象和變化因素之間的低耦合,提高系統的可維護性和擴展性。橋接模式的主要目的是將一個對象的變化與其它變化隔離開,讓彼此之間的耦合度最低。

什么時候使用橋接模式?

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

2.如果希望類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充;如果不使用橋接模式,使用繼承去實現時,在抽象類中添加一個方法,則在對應的實現類中也需要做對應的改動,這種實現不符合松耦合的要求;

3.如果要求對一個抽象的實現部分的修改對客戶不產生影響,即客戶的代碼不需要重新編譯,在后面的項目經驗會說這方面;

4.如果想對客戶完全隱藏抽象的實現部分;

5.如果一個對象有多個變化因素的時候,通過抽象這些變化因素,將依賴具體實現,修改為依賴抽象;

6.如果某個變化因素在多個對象中共享時,可以抽象出這個變化因素,然后實現這些不同的變化因素。

上面使用的場景,是一種建議,也是一種參考。在項目中要很好的把握一個設計模式,是有一定的難度的;當在實際項目中遇到滿足上面的一點或者幾點時,可以考慮使用橋接模式。

UML類圖

C++設計模式之橋接模式

Abstraction類定義了抽象類的接口,并且維護一個指向Implementor實現類的指針;

RefineAbstraction類擴充了Abstraction類的接口;

Implementor類定義了實現類的接口,這個接口不一定要與Abstraction的接口完全一致;實際上,這兩個接口可以完全不同;

ConcreteImplementor類實現了Implementor定義的接口。

代碼實現

 

復制代碼代碼如下:

/*
** FileName     : BridgePatternDemo
** Author       : Jelly Young
** Date         : 2013/12/4
** Description  : More information, please go to http://www.49028c.com
*/
#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;
}

 

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

項目經驗

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

總結

橋接模式使得抽象和實現進行了分離,抽象不用依賴于實現,讓抽象和實現部分各自修改起來都很方便,使用組合(就是Abstraction類中包含了Implementor)的方式,降低了耦合度,同時也有助于分層,從而產生更好的結構化系統。通過實際的項目經驗,使用了橋接模式的代碼,對以后的擴展有很大的幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
另类专区欧美制服同性| 亚洲free嫩bbb| 亚洲精品456在线播放狼人| 久久久精品亚洲| 日韩在线视频线视频免费网站| 欧美wwwxxxx| 欧美日本在线视频中文字字幕| 国产ts人妖一区二区三区| 久久精品国产亚洲| 欧洲美女7788成人免费视频| 国产精品福利观看| 欧亚精品在线观看| xxx一区二区| 国产69精品久久久久99| 亚洲国产91精品在线观看| 亚洲aⅴ日韩av电影在线观看| 成人日韩av在线| 国产一区二区三区久久精品| 欧美一级电影免费在线观看| 国产精品第一视频| 欧美一区三区三区高中清蜜桃| 亚洲国产天堂网精品网站| 亚洲美女免费精品视频在线观看| 精品亚洲一区二区三区在线播放| 久久99久久亚洲国产| 亚洲午夜精品视频| 亚洲自拍高清视频网站| 国产午夜精品免费一区二区三区| 亚洲精品97久久| 亚洲免费影视第一页| 日韩av影视在线| 精品国产乱码久久久久久虫虫漫画| 亚洲第一精品福利| 欧美老女人性视频| 亚洲人成在线播放| 亚洲天堂第二页| 啊v视频在线一区二区三区| 久久久国产精品视频| 欧美高清激情视频| 97视频在线免费观看| 91高潮在线观看| 一区二区欧美久久| 97色伦亚洲国产| 不卡av在线播放| 欧美成人激情在线| 日韩在线免费高清视频| 韩国美女主播一区| 久久av资源网站| 欧美黑人国产人伦爽爽爽| 国产精品99久久久久久人| 亚洲精品99久久久久| 国产精品视频地址| 国产一区二区三区日韩欧美| 欧美国产精品va在线观看| 亚洲小视频在线观看| 精品美女久久久久久免费| 欧美三级欧美成人高清www| 久久久久久国产精品美女| 久久天天躁狠狠躁夜夜躁| 欧美贵妇videos办公室| 91精品免费看| 成人黄色片网站| 亚洲精品国产综合久久| 欧美老女人性生活| 亚洲美女免费精品视频在线观看| 国产亚洲精品日韩| 国产精品亚洲激情| 日韩经典中文字幕在线观看| 欧美日韩久久久久| 国产午夜精品视频| 狠狠躁夜夜躁人人躁婷婷91| 欧美精品久久久久a| 国产精品小说在线| 97色在线观看| 成人观看高清在线观看免费| www.亚洲一二| 在线观看久久av| 国产va免费精品高清在线| 亚洲国产高清高潮精品美女| 最新69国产成人精品视频免费| 久久这里有精品视频| 日韩av在线一区二区| 91爱视频在线| 欧美成人精品激情在线观看| 国产精品久久久av| 91精品在线看| 最近2019免费中文字幕视频三| 欧美裸体xxxx| 97精品国产97久久久久久春色| 8x海外华人永久免费日韩内陆视频| 日韩欧美国产黄色| 美女性感视频久久久| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲tv在线观看| 国外成人在线直播| 91av在线影院| 欧美一区二区大胆人体摄影专业网站| 国产精品美女午夜av| 欧美猛交ⅹxxx乱大交视频| 亚洲国产成人久久综合一区| 国产精品美女av| 欧美一级免费视频| 国产欧美精品xxxx另类| 欧美激情在线播放| 亚洲国产天堂久久综合| 一本色道久久88综合亚洲精品ⅰ| 色先锋久久影院av| 日韩精品视频免费| 欧美亚洲另类在线| 色与欲影视天天看综合网| 久久精品最新地址| 亚洲午夜性刺激影院| 亚洲成人久久电影| 日韩麻豆第一页| 亚洲女人天堂色在线7777| 成人免费观看a| 欧美成人午夜免费视在线看片| 亚洲国产美女久久久久| 色哟哟亚洲精品一区二区| 欧美性在线视频| 亚洲免费高清视频| 日韩在线观看网站| 国产久一一精品| 一区二区欧美久久| 日韩中文字幕国产| 国产一区红桃视频| 91国产中文字幕| 日韩在线精品一区| 久久久噜久噜久久综合| 按摩亚洲人久久| 中文字幕在线成人| 国产精自产拍久久久久久| 日韩国产高清污视频在线观看| 日本在线观看天堂男亚洲| 午夜精品三级视频福利| 久久精品久久久久| www.日韩欧美| 精品国产乱码久久久久酒店| 日韩在线观看免费高清完整版| 欧美日韩精品在线观看| 亚洲图片在区色| 日韩电影在线观看永久视频免费网站| 国产精品久久久久99| 亚洲国产精品专区久久| 国产成人精品久久亚洲高清不卡| 亚洲乱亚洲乱妇无码| 国产日韩精品在线| 亚洲精品国产精品久久清纯直播| 亚洲aaa激情| 国产精品狠色婷| 色偷偷av亚洲男人的天堂| 国产999在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 日韩福利视频在线观看| 在线激情影院一区| 久久久精品国产亚洲| www.久久草.com| 欧美精品18videos性欧美| 久久视频在线视频| 一本色道久久综合亚洲精品小说| 久久久久久一区二区三区| 久久久精品在线| 久久精品国产久精国产一老狼| 久久久免费高清电视剧观看|