国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

2020-01-26 15:17:18
字體:
供稿:網(wǎng)友

問題描述

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

什么是橋接模式?

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

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

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

為什么要使用橋接模式?

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

什么時候使用橋接模式?

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

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

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

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

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

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

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

UML類圖

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

RefineAbstraction類擴充了Abstraction類的接口;

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

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

代碼實現(xiàn)

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

/*
** FileName     : BridgePatternDemo
** Author       : Jelly Young
** Date         : 2013/12/4
** Description  : More information, please go to //m.survivalescaperooms.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;
}

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

項目經(jīng)驗

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

總結(jié)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 苗栗市| 宣汉县| 龙川县| 平乡县| 茂名市| 南丹县| 宣城市| 澎湖县| 延吉市| 江安县| 南开区| 广宗县| 南投县| 霍邱县| 花莲县| 新宁县| 阜宁县| 邮箱| 泸溪县| 大丰市| 宁河县| 唐河县| 东丽区| 叶城县| 九台市| 濉溪县| 旌德县| 扬中市| 昆明市| 淮南市| 奉贤区| 大安市| 富蕴县| 红河县| 阜阳市| 田阳县| 沙田区| 宁河县| 错那县| 日土县| 正阳县|