農林漁牧網

您現在的位置是:首頁 > 農業

用 C++ 跟你聊聊“橋接模式”| 原力計劃

2022-01-14由 CSDN 發表于 農業

橋接模式是什麼意思

用 C++ 跟你聊聊“橋接模式”| 原力計劃

作者 | 看,未來

責編 | 夕顏

出品 | CSDN部落格

橋接模式,號稱設計模式中最抽象的一個,不是吹出來的啊。且看我能不能講清楚啊。

這時候就體現出小故事的重要性了,這也是我為什麼每篇設計模式都要先講個小故事,便於理解記憶嘛。

用 C++ 跟你聊聊“橋接模式”| 原力計劃

手機配置的小故事

故事是別人的,網上一搜“橋接模式”,基本能看到這個故事。

手機品牌和軟體是兩個概念,不同的軟體可以在不同的手機上,不同的手機可以有相同的軟體,兩者都具有很大的變動性。如果我們單獨以手機品牌或手機軟體為基類來進行繼承擴充套件的話,無疑會使類的數目劇增並且耦合性很高。

原始構造

文字不明顯,我們看圖:

用 C++ 跟你聊聊“橋接模式”| 原力計劃

現在我們以手機品牌為抽象基類,每個品牌的手機底下都要求實現:我能打遊戲、我能打電話、我能線上撩妹、我能聽音樂等功能,於是形成上面這個圖。

且不說M品牌手機和N品牌手機的功能重疊,就單說我現在要加一個功能,我能付錢,要加幾個類?那我現在再加一個O品牌手機,要從哪兒入手,這個改動大不?

對上面這張類圖的拓展,簡直可以說是指數增長!!!

判處這個設計不及格,打回重構。

重構

前面已經暗示過了,每個品牌的手機,他們的功能都有互通點,比如都要能打電話、能上網、能拍照、能···不然基本賣不出去的。

那我們自然而然就可以聯想到將這些功能抽象出來,在將這個抽象類聚合到品牌類下去,這樣不就可以實現對功能與品牌的解耦嘛。

那,再看圖:

用 C++ 跟你聊聊“橋接模式”| 原力計劃

現在呢,要新增一個品牌,就新增唄,沒人攔著你,新增品牌和手機軟體並沒有一毛錢關係,要新增一個軟體,那就新增嘛,暢通無阻的事兒。手機軟體下還要加子類怎麼辦?看情況,如果對子類的拓展情況不理想,可以考慮再獨立出來一個抽象類。

用 C++ 跟你聊聊“橋接模式”| 原力計劃

合成/聚合原則

合成/聚合原則:儘量使用合成/聚合,儘量不要使用類繼承。

聚合表示一種弱的“擁有”關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣。

合成/複用原則的好處:有助於保持每個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,並且不太可能增長為不可控的龐然大物。

用 C++ 跟你聊聊“橋接模式”| 原力計劃

橋接模式

用 C++ 跟你聊聊“橋接模式”| 原力計劃

抽象基類及介面:

Abstraction::Operation:定義要實現的操作介面

AbstractionImplement::Operation:實現抽象類Abstaction所定義操作的介面,由其具體派生類ConcreteImplemenA、ConcreteImplemenA或者其他派生類實現。

在Abstraction::Operation中根據不同的指標多型呼叫AbstractionImplement::Operation函式。

用 C++ 跟你聊聊“橋接模式”| 原力計劃

小故事程式碼實現

#include

using namespace std;

//手機軟體類 - 抽象基類

class softbase {

public:

virtual void run = 0;

};

//手機軟體 - 實現類

class softmusic:public softbase{

public:

void run { cout << “Music!” << endl; }

};

class softgame :public softbase {

public:

void run { cout << “welcome to WangZheRongYao!” << endl; }

};

//手機品牌類 - 抽象基類

class brandbase {

protected:

softbase* soft;

public:

void setSoft(softbase* s) { this->soft = s; }

virtual void run = 0;

};

//手機品牌類 - 實現類

class brandM:public brandbase{

public:

void run { soft->run; }

};

class brandN :public brandbase {

public:

void run { soft->run; }

};

int main

{

//這裡提供的是單功能新增,若要多功能,可以自己新增STL容器進來,或者看前一篇:備忘錄模式

brandbase* bm = new brandM;

bm->setSoft(new softmusic);

bm->run;

bm->setSoft(new softgame);

bm->run;

brandbase* bn = new brandN;

bn->setSoft(new softmusic);

bn->run;

bn->setSoft(new softgame);

bn->run;

return 0;

}

用 C++ 跟你聊聊“橋接模式”| 原力計劃

應用場景

設計中有超過一維的變化我們就可以用橋模式。如果只有一維在變化,那麼我們用繼承就可以圓滿的解決問題。

如果有哪裡講的不清不楚,歡迎指正批評。

版權宣告:本文為CSDN博主「看,未來」的原創文章,遵循CC 4。0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

原文連結:

https://blog。csdn。net/qq_43762191/java/article/details/106187686

6月2日20:00

,CSDN 創始人&董事長、極客幫創投創始合夥人蔣濤攜手全球頂級開源基金會主席、董事,聚焦中國開源現狀,直面開發者在開源技術、商業上的難題,你絕不可錯過的開源巔峰對談!立即

免費圍觀

用 C++ 跟你聊聊“橋接模式”| 原力計劃

☞重磅!阿里巴巴開源首個邊緣計算雲原生專案 OpenYurt

☞微信迴應 WeTool 被封事件;支付寶小程式開放直播功能;Raspberry Pi 4 釋出 8GB 版本| 極客頭條

☞都無程式碼了,還要程式設計師嗎?

☞附程式碼 | OpenCV實現銀行卡號識別,字元識別演算法你知多少?

☞因為一個跨域請求,我差點丟了飯碗

☞區塊鏈的 Layer 2 擴容(Scaling)是否兌現了其承諾?