《大話設計模式》 第22個 橋接模式

2021-07-24 22:13:40 字數 1590 閱讀 8620

今天學習了橋接模式:此模式可以解決因為設計不當的繼承而導致的類**問題,如下類圖所示:

此類圖的設計目的是為了給不同手機品牌各自設計不同的通訊錄和遊戲功能。但是可以看到,這樣設計出來的**可擴充套件性比較差。1)如果要再加另外一種手機品牌,那麼就必須新增乙個手機品牌類,再新增相應的遊戲和通訊錄類。 2)如果對每款手機都增加了乙個新的功能如拍照,那麼就得給每種手機品牌下增加乙個新的拍照功能。

這兩種情況都會導致類**。

其實從這個類圖可以看出一些類**的端倪,我們知道繼承必須是一種is a的關係,可是從此繼承層次來看,明顯通訊錄和遊戲不應該繼承於手機品牌,是不合理的。

這是另外乙個角度的不當設計:在不同的手機軟體抽象類下去區分不同的手機品牌。這樣不管是增加乙個新的軟體或者是增加一種新的手機品牌都需要新增較多的類。

我們可以從這兩種不當的設計當中感覺到**有些問題:其實是因為這種設計將手機品牌和不同的軟體雜糅在一起,這樣的繼承產生的類會以 品牌數 x 軟體數 的方式增加,極易形成類的**。

那麼下面我們將手機品牌和手機軟體來分開設計如下:

從這個類圖可以看到,手機軟體和手機品牌是分開來設計的,手機軟體作為手機品牌的乙個組成部分(組合關係)被手機品牌維護。這種設計方式,要增加乙個手機品牌只需要重新繼承乙個新的品牌,要新增一款軟體也只需要從手機軟體類中派生乙個新的子類。

合理設計的**如下:

bridge.h

#ifndef _bridge_h_

#define _bridge_h_

#include

using namespace std;

class phonesoft

;class phonegame : public phonesoft

};class phonecontacts : public phonesoft

};class phonebrand

virtual

void run () = 0;

protected:

phonesoft *psoft; // 手機品牌持有軟體物件指標(組合關係)

};class phonebrandn : public phonebrand

};class phonebrandm : public phonebrand

};#endif

bridge.cpp

#include

"bridge.h"

int main (void)

其實我覺的書上實現的這個例子有問題,比如如何體現不同品牌手機安裝的遊戲軟體的差異性?當前的這種實現是不同的品牌安裝的遊戲軟體都是相同的,那麼如果不同品牌要安裝不同的遊戲軟體,是否也需要從遊戲類中派生出不同品牌的軟體?

大話設計模式 橋接模式

一 合成 聚合復用原則 盡量使用合成 聚合而不是繼承。二 橋接模式 將抽象部分與它的實現部分分離,使它們都可以獨立的變化。實現指的是抽象類和它的派生類用來實現自己的物件。三 示例 public abstract class handsetsoft public class handsetgame e...

《大話設計模式》讀書筆記 第22章 橋接模式

1 合成 聚合復用原則 carp 盡量使用合成 聚合,盡量不要使用類繼承。2 合成 聚合復用原則的好處 優先使用物件的合成 聚合將有助於你保持每個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,並且不太可能增長為不可控制的龐然大物。3 橋接模式 bridge 將抽象部分與它的實現部...

018 第22章 橋接模式

簡述 橋接模式 將抽象部分與它的實現部分分離,是它們都可以獨立的變化。橋接模式包括 抽象類 具體抽象類 實現類 具體實現類。抽象類 抽象要執行的操作。具體抽象類 包含實現類的指標,實現抽象類的虛函式。實現類 具體實現的抽象。具體實現類 實現類的具體實現。橋接模式 1 include 2 using ...