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

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

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

2020-01-26 15:17:18
字體:
來源:轉載
供稿:網友

問題描述

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

什么是橋接模式?

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

復制代碼 代碼如下:

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類圖

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

RefineAbstraction類擴充了Abstraction類的接口;

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

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

代碼實現

復制代碼 代碼如下:

/*
** FileName     : BridgePatternDemo
** Author       : Jelly Young
** Date         : 2013/12/4
** Description  : More information, please go to //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
国产免费一区二区三区香蕉精| 亚洲男人天堂古典| 国模叶桐国产精品一区| 精品久久香蕉国产线看观看亚洲| 国产精品极品美女在线观看免费| 国产区亚洲区欧美区| 91美女片黄在线观看游戏| 日韩人在线观看| 亚洲剧情一区二区| 欧美黑人视频一区| 中文字幕欧美精品在线| 日韩精品在线免费播放| 国模叶桐国产精品一区| 日韩精品视频观看| 欧美日韩国产丝袜美女| 欧美黄色性视频| 国内精品小视频| 欧美日韩国产精品一区二区不卡中文| 情事1991在线| 91日本视频在线| 精品视频9999| 亚洲精选中文字幕| 欧美综合一区第一页| 欧美第一淫aaasss性| 91九色精品视频| 亚洲一区美女视频在线观看免费| 狠狠干狠狠久久| 日韩高清电影好看的电视剧电影| 中文国产成人精品| 精品无人区乱码1区2区3区在线| 欧美寡妇偷汉性猛交| 久久免费视频这里只有精品| 久久免费视频在线观看| 亚洲自拍偷拍在线| 日韩av123| 欧美大片在线看免费观看| 欧美日韩美女在线观看| 欧美激情中文字幕在线| 亚洲精品日韩av| 国内精品一区二区三区四区| 亚洲精品国产精品久久清纯直播| 国产精品久久久久久五月尺| 国产在线观看91精品一区| 亚洲少妇激情视频| 91精品国产综合久久香蕉| 久久久久久久久久亚洲| 精品自拍视频在线观看| 日韩激情视频在线| 久久精品最新地址| 午夜伦理精品一区| 北条麻妃一区二区在线观看| 亚洲精品日韩av| 日韩免费av在线| 久热爱精品视频线路一| 国产精品色悠悠| 亚洲国产精彩中文乱码av| 亚洲资源在线看| 久久精品久久精品亚洲人| 国产精品96久久久久久| 91精品成人久久| 亚洲精品久久久久久下一站| 色一情一乱一区二区| 国产一区二区三区在线看| 欧美精品性视频| 成人久久久久久| 精品久久久av| 精品少妇v888av| 欧美亚洲日本黄色| 久久97精品久久久久久久不卡| 亚洲欧美在线免费观看| 欧美尺度大的性做爰视频| 97超级碰在线看视频免费在线看| 国产精品久久久久久婷婷天堂| 国产日韩精品在线观看| 国产精品成人品| 欧美激情影音先锋| 亚洲综合社区网| 97国产成人精品视频| 精品magnet| 国产精品免费久久久久影院| 日韩av高清不卡| 欧美性xxxxxxx| 久久久国产一区| 少妇av一区二区三区| 国产精品偷伦视频免费观看国产| 国产精品极品美女粉嫩高清在线| 91日韩在线播放| 国产精彩精品视频| 精品偷拍一区二区三区在线看| 亚洲成人黄色在线观看| 国产精品对白刺激| 伊人伊成久久人综合网小说| 色综合久久久久久中文网| 97国产在线视频| 国产成人精品一区二区三区| 日韩网站免费观看高清| 日韩免费在线看| 中国日韩欧美久久久久久久久| 色综合亚洲精品激情狠狠| 日韩中文字幕免费看| 92版电视剧仙鹤神针在线观看| 欧美激情在线播放| 在线观看国产欧美| 欧美丰满少妇xxxxx做受| 色无极亚洲影院| 国产69久久精品成人| 欧美黑人性生活视频| 欧美色视频日本高清在线观看| 久久久久久久久久久免费精品| 91超碰中文字幕久久精品| 91九色蝌蚪国产| 日韩欧美亚洲综合| 久久久久久久国产| 国产精品欧美日韩久久| 亚洲美女黄色片| 成人网页在线免费观看| 国产精品一区二区三区在线播放| 日韩麻豆第一页| 欧美激情xxxx性bbbb| 久久久久久久av| 日韩国产一区三区| 亚洲经典中文字幕| 精品一区二区三区四区| 国产欧美日韩专区发布| 亚洲欧美激情另类校园| 91中文精品字幕在线视频| 美女av一区二区三区| 美女少妇精品视频| 在线看国产精品| 亚洲精品网站在线播放gif| 国产精品入口免费视| 亚洲欧美国内爽妇网| 欧美激情影音先锋| 亚洲精品国产精品久久清纯直播| 亚洲欧美日韩精品久久奇米色影视| 欧美一级淫片播放口| 亚洲一区二区免费| 91禁国产网站| 丝袜美腿亚洲一区二区| 亚洲国产另类久久精品| 亚洲人精品午夜在线观看| 国产成人在线播放| 米奇精品一区二区三区在线观看| 国产丝袜一区二区三区免费视频| 欧美大秀在线观看| 成人一区二区电影| 国产欧美精品xxxx另类| 色偷偷亚洲男人天堂| 性色av香蕉一区二区| 久久韩剧网电视剧| 国内免费久久久久久久久久久| 91嫩草在线视频| 亚洲一区中文字幕| 日韩精品一区二区三区第95| 亚洲国产精品字幕| 中文字幕亚洲欧美在线| 国产日本欧美一区二区三区| 色999日韩欧美国产| 久国内精品在线| 中文字幕无线精品亚洲乱码一区| 国产精品久久久精品| 啊v视频在线一区二区三区| 日韩av免费观影| 性色av一区二区三区红粉影视|